对于每个子文件夹,按名称对文件进行排序并将它们重命名为连续的填充数字(无论扩展名如何)

Mat*_*ens 5 bash filenames sort rename

我有以下目录结构:

.
??? 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
Run Code Online (Sandbox Code Playgroud)

对于每个二级子文件夹(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
Run Code Online (Sandbox Code Playgroud)

rename如果这使事情变得更容易,则可以使用实用程序

主要问题是找出每个文件应该得到的数字。我是否需要使用嵌套for循环来遍历event-xalbum-x子文件夹,然后对于每个内部循环,自己跟踪数字,或者是否有一些我遗漏的聪明解决方案?

gle*_*man 7

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
Run Code Online (Sandbox Code Playgroud)

假设您有一个没有扩展名的文件。在这种情况下,它将具有相同的名称,除了前导数字(例如my_file=> 05.my_file

所有非隐藏目录条目都将被重命名,包括目录。