サブフォルダごとにファイルを名前で並べ替え、拡張子に関係なく連続したパディング番号に名前を変更します。

サブフォルダごとにファイルを名前で並べ替え、拡張子に関係なく連続したパディング番号に名前を変更します。

次のディレクトリ構造があります。

.
├── event-a
│   ├── album-a
│   │   ├── a.jpg
│   │   └── x.png
│   └── album-b
│       ├── a.jpg
│       ├── x.png
│       └── y.gif
└── event-b
    ├── album-x
    │   ├── a.jpg
    │   └── x.png
    └── album-y
        ├── a.jpg
        ├── x.png
        └── y.gif

2番目のレベルの各サブフォルダ(album-foo例では名前付け)について、ファイルを名前で並べ替え、拡張子に関係なく連続パディング番号に名前を変更したいと思います。これらのフォルダにはJPG、PNG、またはGIFイメージを含めることができ、すべてのファイル拡張子を保持する必要があります。

したがって、この場合は次のようなものを得たいと思います。

.
├── event-a
│   ├── album-a
│   │   ├── 01.jpg
│   │   └── 02.png
│   └── album-b
│       ├── 01.jpg
│       ├── 02.png
│       └── 03.gif
└── event-b
    ├── album-x
    │   ├── 01.jpg
    │   └── 02.png
    └── album-y
        ├── 01.jpg
        ├── 02.png
        └── 03.gif

rename実用的な事項物事が簡単になったら使用してください。

主な問題は、各ファイルがどれだけ得られるべきかを把握することです。入れ子になったforループを使用して繰り返し、サブフォルダを作成し、event-x各内部ループについて直接数値を追跡する必要がありますかalbum-x、それとも私が見逃した賢い解決策はありますか?

ベストアンサー1

for dir in */*; do           # loop over the directories
    (                        # run in a subshell ...
        cd "$dir"            # ... so we don't have to cd back
        files=(*)            # store the filenames in a zero-indexed array

        for index in "${!files[@]}"; do
            file=${files[$index]}
            ext=${file##*.}
            newname=$(printf "%02d.%s" $((index+1)) "$ext")
            mv "$file" "$newname"
        done
    )
done

拡張子のないファイルがあるとしましょう。この場合、前の数字を除いて名前は同じです(例:my_file=> 05.my_file)。

ディレクトリを含む非表示にされていないすべてのディレクトリエントリの名前が変更されます。

おすすめ記事