Bash
對於每個子文件夾,按名稱對文件進行排序並將它們重命名為連續的填充數字(無論副檔名如何)
我有以下目錄結構:
. ├── 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
對於每個二級子文件夾(
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
子文件夾,然後對於每個內部循環,自己跟踪數字,還是我缺少一些聰明的解決方案?
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
)所有非隱藏目錄條目都將被重命名,包括目錄。