Bash

對於每個子文件夾,按名稱對文件進行排序並將它們重命名為連續的填充數字(無論副檔名如何)

  • November 26, 2018

我有以下目錄結構:

.
├── 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-xalbum-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

所有非隱藏目錄條目都將被重命名,包括目錄。

引用自:https://unix.stackexchange.com/questions/37121