
次のような画像ファイルがたくさんあります。
a.png, b.png, c.png, etc
次の数字のファイル名マッピングを含むファイルがある場合(形式を無視すると何でも可能です):
a=>1
b=>2
c=>3
...
マップファイルを使用してすべてのファイルの名前をまとめて変更する簡単な方法はありますか?
1.png, 2.png, 3.png, etc
Unix / Linuxコマンドを探しています。私は非常に単純なスクリプトを書くことができることを知っていますが、他の技術があるかどうか疑問に思います。
ありがとう
答え1
コマンドなしすべて;これはスクリプト可能なシェルを持つ点です。
while read -r old new; do
mv "$old.png" "$new.png"
done < map.txt
答え2
sedがない場合は、bashで次の置換を実行できます。
for line in $(< patterns) ; do echo "Pattern: " $line " char: " ${line/=>*/} " nr: " ${line/*=>/}; done
("パターン"は a=>1 などのファイルになります) 結果は次のとおりです。
for line in $(< patterns) ; do
c=${line/=>*/}
n=${line/*=>/}
mv $c.png $n.png
done
bashのマンページには、「String Substitution」の下にこのオプションとその他の興味深いオプションがリストされています。
たぶんPerlsrename
も興味深いオプションかもしれません。スキーマを使用して大規模な名前を変更できます。
rename 's/^a/1/' a*png
Ubuntuでは、Perlパッケージafaikが付属しています。
答え3
Perl方式は次のとおりです。
cat mapfile | perl -e 'my$h={eval join(",",<>)};while (($k,$v)=each%$h){`mv $k.png $v.png`}'
2回目の試み:
perl -nle '(@a=map{s/^\s+//;s/\s+$//;s/'/\\'/g;$_}split/\s*=>\s*/,$_,2)and`mv \'$a[0].png\' \'$a[1].png\'`'
適用対象:
Someone's $tupid file name => renamed by "simple" script?!