各フォルダ内に1000個以上のjpegを含む約200個のフォルダがあり、すべて4桁までゼロパディングが必要です。これらのフォルダの中には、より深い画像を含むサブディレクトリもあります。写真の名前はすべて異なります(たとえば、あるフォルダではImage_1.jpg、Image_11.jpgなどと呼ばれ、他のフォルダにはPhoto01.jpg、Photo02.jpgというファイルが含まれる場合があります)
.
├── folderA
│ ├── subfolder1
│ │ ├── Photo_1.jpg
│ │ └── Photo_11.jpg
│ └── subfolder2
│ ├── image001.jpg
│ ├── image002.jpg
│ └── image003.jpg
└── folderB
├── subfolder1
│ ├── foto_01.jpg
│ └── foto_01.jpg
└── subfolder2
├── foto_01.jpg
├── foto_02.jpg
└── foto_03.jpg
すべてのサブフォルダに移動して、ファイル名の数字0を4文字で埋めるコマンドを実行する方法を教えることができる人はいますか?
答え1
使用perl
rename
:
rename -n --filename 's/\d+/sprintf("%04d",$&)/e' *.jpg
または再帰的に:
find . -type f -name "*.jpg" -exec rename -n --filename 's/\d+/sprintf("%04d",$&)/e' {} +
- このフラグは、パスではなくファイル名のみが変更されることを保証します。そうでなければ、等の
--filename
結果が得られます。subfolder0001
-n
出力が満足な場合は削除してください。
答え2
未使用のソリューションの場合Perlモジュールrename
このユースケースの場合:
files=$(find . -name '*.jpg' -type f)
newfiles=$(echo "$files" \
| sed -E 's|(.*/.*[^[:digit:]]+)([[:digit:]]+)(\.jpg)|\1\t\2\t\3|' \
| awk -F '\t' '{print $1 sprintf("%04d",$2) $3}')
while read f1; read -u 3 f2; do
echo mv "$f1" "$f2"
done <<< "$files" 3<<< "$newfiles"
説明する
このfiles
変数は見つかったすべてのjpgを保存します。find
必要に応じて「-regex」を使用できます。
このnewfiles
変数は新しいjpgファイル名を保存します。コードはパス名を3つの部分に分割します。中央の部分はjpgファイル名の末尾の数字で、幅が4になるようにゼロで埋められます。
ループwhile
は2つの変数を読み取り、これら2つの変数のファイル名のリストを使用してコマンドを実行します。この場合、mv
コマンドを画面にエコーします。echo
実際の移動を行うには削除してください。
read -d
ファイル名の間にヌル文字を追加し、addなどを使用してその文字を読み取って改行、read -r
タブ、またはバックスラッシュを含むパスを処理するようにこのコードを改善できます。
名前変更以外の操作の将来の使用シナリオでこれを使用して変更することができます。
出力
以下は、サンプルディレクトリツリーの出力です。
mv ./folderB/subfolder2/foto_01.jpg ./folderB/subfolder2/foto_0001.jpg
mv ./folderB/subfolder2/foto_02.jpg ./folderB/subfolder2/foto_0002.jpg
mv ./folderB/subfolder2/foto_03.jpg ./folderB/subfolder2/foto_0003.jpg
mv ./folderB/subfolder1/foto_01.jpg ./folderB/subfolder1/foto_0001.jpg
mv ./folderB/subfolder1/foto_02.jpg ./folderB/subfolder1/foto_0002.jpg
mv ./folderA/subfolder2/image002.jpg ./folderA/subfolder2/image0002.jpg
mv ./folderA/subfolder2/image003.jpg ./folderA/subfolder2/image0003.jpg
mv ./folderA/subfolder2/image001.jpg ./folderA/subfolder2/image0001.jpg
mv ./folderA/subfolder1/Photo_1.jpg ./folderA/subfolder1/Photo_0001.jpg
mv ./folderA/subfolder1/Photo_11.jpg ./folderA/subfolder1/Photo_0011.jpg