マップファイルを使用してバッチファイルの名前を変更する

マップファイルを使用してバッチファイルの名前を変更する

次のような画像ファイルがたくさんあります。

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?!

関連情報