Linuxでコマンドラインを使用して複数のサブディレクトリ内の複数のファイルをゼロで埋める方法は?

Linuxでコマンドラインを使用して複数のサブディレクトリ内の複数のファイルをゼロで埋める方法は?

各フォルダ内に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

関連情報