置換検索を使用してバッチファイル名を変更する

置換検索を使用してバッチファイル名を変更する

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

(マッピングファイルに"、、$バックスラッシュ、またはバックティック文字が含まれていないとします。

関連情報