Bashを使って大量のファイル名をまとめて変更するには?既存の名前と「コンテキストマッピング」に基づいて各ファイルの新しい名前を設定する必要があります。何と呼ぶのかよくわかりません。名前の断片化です。
次のファイルがたくさんあります。
001.jpg
003.jpg
004.jpg
007.jpg
...
そして次のマップがあります:
001,white
003,grey
004,red
007,green
...
001.jpgが001-white.jpgなどになるように、すべてのファイルの名前を変更したいと思います。
どうすればいいですか?
答え1
bash4:配列への最初の読み取りマッピング
declare -A arr2
while IFS=, read -r -a arr; do
arr2[${arr[0]}]="${arr[1]}";
done < mapfile.txt
その後、名前を変更してください
for f in [0-9][0-9][0-9].jpg; do
if [[ "${arr2[${f%.*}]+_}" ]]
then
mv -- "${f}" "${f%.*}"-"${arr2[${f%.*}]}"."${f##*.}";
else
mv -- "${f}" "${f%.*}"-default."${f##*.}";
fi
done
答え2
簡単に実行できます
join -t. -j1 <(tr , . < map) filelist | sed 's/\./-/' | paste filelist - | xargs -L1 mv
map
コンテキストマップはどこにあり、filelist
ファイルリストはどこにありますか?結合は分割され、最初の.
フィールドを結合値として使用します。両方のリストを並べ替える必要があります。 paste
次に、各行をfilelist
新しく作成されたファイル名と一緒に付け、各行をxargs
呼び出しますmv
。
答え3
ここにあります:
for file in [0-9][0-9][0-9].jpg;do
name="${file%%.*}" # Remove extension
map="$(grep "$name" map_file | cut -d',' -f 2)"
echo mv "$file" "$name-$map".jpg
done
これは「map」がファイルにあると仮定しますmap_file
。最新バージョンのBashでは、map_file
名前を変更する新しいファイルを繰り返すのではなく、このファイルを連想配列に変換して便宜のために使用することもできます。
ところで、これは単なるecho
命令ですmv
。すべてが大丈夫だと思われる場合は、削除しecho
て実際に名前を変更できます。
答え4
< map sed 's/\([^,]*\),\(.*\)/mv -- "\1.jpg" "\1-\2.jpg"/' | sh -x
(マッピングファイルに"
、、$
バックスラッシュ、またはバックティック文字が含まれていないとします。