コピーしたいファイル
test/motodata.txt
置き換えたいファイル
/data/aiueo/a/text/motodata.txt
/i/text/motodata.txt
/u/text/motodata.txt
/data/kakikukeko/ka/text/motodata.txt
/ki/text/motodata.txt
以下200~300続く
shellコマンドでもできるのかもしれませんが、複雑な処理をするときは、自分はperlを使います。
まずは、以下の内容のテキストファイルを作成し、cpall.pl の名前で test フォルダに保存します。
このとき、文字のエンコードは utf-8 としてください(日本語のファイルやフォルダも正しく扱えます)。
また、改行コードは LF としてください。
#!/usr/bin/perl
use utf8;
use File::Copy;
binmode STDOUT, ':utf8';
binmode STDIN, ':utf8';
$create_folder = 0;
$original = $ARGV[0];
utf8::decode($original);
(($original ne '') && (-e $original)) or die "Usage: cpall.pl source_file\n";
@dir_list = &find_folders('./data');
foreach my $par (sort @dir_list) {
my @sub_dir_list = &find_folders('./data/'.$par);
foreach (sort @sub_dir_list) {
my $text_exists = 1;
my $text_dir = "./data/$par/$_/text/";
unless (-d $text_dir) {
if ($create_folder) {
mkdir $text_dir;
unless (-d $text_dir) {
$text_exists = 0;
}
} else {
$text_exists = 0;
}
}
if ($text_exists) {
print "$text_dir ... ";
copy($original, "$text_dir/$original");
if (-e "$text_dir/$original") {
print "$original\n";
} else {
print "COPY ERROR\n";
}
} else {
print "$text_dir ... directory not found\n";
}
}
}
sub find_folders {
my @folders;
my $par = $_[0];
if (opendir my $in_dir, $par) {
my @list = readdir($in_dir);
closedir $in_dir;
foreach (@list) {
utf8::decode($_);
if ((-d $par.'/'.$_) && ($_ ne '.') && ($_ ne '..')) {
push (@folders, $_);
}
}
}
@folders;
}
次にターミナルを開き、test フォルダに cd してから、次のコマンドで cpall.pl を実行可にします。
hogehoge$ chmod 700 cpall.pl
次に次の要領で cpall.pl を実行します。
hogehoge$ ./cpall.pl motodata.txt
以上で、存在しているフォルダ全てに motodata.txt がコピーされます。
なお、7行目の $create_folder を 1 とすると、text フォルダがなかった場合には、作成してコピーを行います。
このコマンドを実行する場合には、コピー元のテキストファイルと、コピー対象となる複数フォルダが入っている data フォルダが同じ階層に入っている必要があります。また、コマンド実行時のカレントディレクトリも当該フォルダである必要があります。
必要に応じて使いやすいように修正してください。
perlプログラムの説明を始めるときりがないので、ここでは詳細は説明しません。
perlは特に文字データの処理に非常に強く、データ処理ツールとしてかなり強力です。
webのcgiもperlで書かれることが多く、送信されたフォームの正規化や定型処理にも使えます。
ちょっとした小道具をよく作るのであれば、知っていて損はないと思います。