我的图片保存在以图片日期为文件夹名称的文件夹中,例如原始路径和文件名:
.../Pics/2016_11_13/wedding/DSC0215.jpg
.../Pics/2016_11_13/afterparty/DSC0234.jpg
.../Pics/2016_11_13/afterparty/DSC0322.jpg
如何将图片重命名为以下格式,连续序列和 4 位填充?
.../Pics/2016_11_13_wedding.0001.jpg
.../Pics/2016_11_13_afterparty.0002.jpg
.../Pics/2016_11_13_afterparty.0003.jpg
我使用的是 Bash 4.1,所以只有 mv 命令可用。这是我现在拥有的,但它不起作用
#!/bin/bash
p=0
for i in *.jpg;
do
mv "$i" "$dirname.%03d$p.JPG"
((p++))
done
exit 0
最佳答案
假设您有类似 .../Pics/2016_11_13/wedding/XXXXXX.jpg 的内容;然后进入目录.../Pics/2016_11_13;从那里,你应该有一堆子目录,比如 wedding、afterparty 等等。启动这个脚本(免责声明:我没有测试它):
#!/bin/sh
for subdir in *; do # scan directory
[ ! -d "$subdir" ] && continue; # skip non-directory
prognum=0; # progressive number
for file in $(ls "$dir"); do # scan subdirectory
(( prognum=$prognum+1 )) # increment progressive
newname=$(printf %4.4d $prognum) # format it
newname="$subdir.$newname.jpg" # compose the new name
if [ -f "$newname" ]; then # check to not overwrite anything
echo "error: $newname already exist."
exit
fi
# do the job, move or copy
cp "$subdir/$file" "$newname"
done
done
请注意,我跳过了“日期”(2016_11_13) 部分 - 我不确定。如果您只有一个日期,那么很容易将这些数字添加到# compose the new name 中。如果你有多个日期,那么你可以添加一个嵌套的 for
来扫描“日期”目录。我跳过这个的另一个原因是让你自己开发一些东西,一些你可以引以为豪的东西......
关于linux - 如何在 bash 中使用路径名和重新排序的序列批量重命名多个图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42357781/