我有一个图像目录,其中有更多子目录,其中包含带有随机文件名的图像。
images/black-shoe/gsafdfs.jpg
images/black-shoe/ggdfgdf.jpg
images/black-shoe/gdfgd3f.jpg
images/black-shoe/g4twegd.jpg
images/red-shoe/ggsdgdfs.jpg
images/red-shoe/gskjhkhf.jpg
images/red-shoe/gsakytfs.jpg
我想将所有图像批量重命名为它们的父目录,但为了防止一个图像覆盖另一个图像,请添加这样的后缀。
images/black-shoe/black-shoe-1.jpg
images/black-shoe/black-shoe-2.jpg
images/black-shoe/black-shoe-3.jpg
images/black-shoe/black-shoe-4.jpg
images/red-shoe/red-shoe-1.jpg
images/red-shoe/red-shoe-2.jpg
images/red-shoe/red-shoe-3.jpg
我使用 Debian 8,熟悉使用命令行。理想情况下,我希望有一个小脚本或一行程序,可以在 images/ 中执行,以便一次性将它们应用于所有子目录。
答案1
这个简短的脚本应该可以解决问题(文件和目录名称可能包含空格):(应该使用 basedir 作为参数来调用)
#!/bin/bash
basedir=$1
while IFS= read -r -d '' path;
do
dirn=$(basename "$path")
echo "===> $path"
let i=1
while IFS= read -r -d '' fname;
do
fext=$(echo "$fname" | awk -F '.' '{print $NF}')
mv "$fname" "${path}/${dirn}-${i}.${fext}"
let i=i+1
done < <(find "$path" -maxdepth 1 -type f -print0)
done < <(find "$basedir" -type d -print0)