linux - 如何在 bash 中使用路径名和重新排序的序列批量重命名多个图像?

标签 linux bash rename batch-processing mv

我的图片保存在以图片日期为文件夹名称的文件夹中,例如原始路径和文件名:

.../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/

相关文章:

linux - 创建命令历史记录管道,如何摆脱 ack 传递的换行符?

linux - PID、PPID和TGID的含义

unix - 如何删除文件名单词前的数字

bash - 在 Bash 脚本中给定数组变量名称的数组,循环遍历数组元素

linux - 重命名一组连续的文件

python - 使用 Python 重命名目录中的所有文件

python - 无法加载动态库 'libnvinfer.so.6'

linux - 在 Unix/Linux 上获取昨天的文件

linux - Bash 脚本在文件名中生成项目符号

linux - 如何解析脚本中差异的结果?