次のディレクトリ構造があります。
.
├── 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
)。
ディレクトリを含む非表示にされていないすべてのディレクトリエントリの名前が変更されます。