【问题标题】:Batch rename images to folder name + sequential number [duplicate]批量重命名图像为文件夹名称+序号[重复]
【发布时间】:2016-11-25 15:58:17
【问题描述】:

我想将带有子目录的目录中的文件重命名为父目录名+序号。

例如:

hello-images/
    ├── first-black
    │   ├── full_b200056_m.png
    │   ├── full_b200056_x_DSC01973.JPG
    │   ├── full_b200056_x_DSC01978.JPG
    │   ├── full_b200056_x_DSC01988.JPG
    │   ├── full_b200056_x_DSC01994.JPG
    │   ├── full_b200056_x_DSC02003.JPG
    ├── second-atlas
    │   ├── full_b200035_m1.png
    │   ├── full_b200035_x_3926.JPG
    │   ├── full_b200035_x_3928.JPG
    │   ├── full_b200035_x_3931.JPG
    │   ├── full_b200035_x_3944.JPG

想要的结果:

hello-images/
├── first-black
│   ├── first-black_1.png
│   ├── first-black_2.JPG
│   ├── first-black_3.JPG
│   ├── first-black_4.JPG
│   ├── first-black_5.JPG
│   ├── first-black_6.JPG
├── second-atlas
│   ├── second-atlas_1.png
│   ├── second-atlas_2.JPG
│   ├── second-atlas_3.JPG
│   ├── second-atlas_4.JPG
│   ├── second-atlas_5.JPG

【问题讨论】:

  • 为什么first-black下的图片改名为1,3,4,5,6,7为什么不改名为2

标签: linux bash


【解决方案1】:

hello-images 目录,执行:

for d in */; do i=1; for f in "$d"/*.*; do echo mv -- "$f" "$d${d%/}_${i}.${f##*.}"; ((i++)); done; done

这是空运行,它将显示要运行的mv 命令。如果对所做的更改感到满意,请删除echo 以进行实际操作:

for d in */; do i=1; for f in "$d"/*.*; do mv -- "$f" "$d${d%/}_${i}.${f##*.}"; ((i++)); done; done

展开形式:

for d in */; do 
    i=1
    for f in "$d"/*.*; do 
        mv -- "$f" "$d${d%/}_${i}.${f##*.}"
        ((i++))
    done
done

【讨论】:

  • 您好,我刚刚编辑了您的代码,最终文件名中缺少下划线和 .jpg 扩展名。代码的一个小问题:重命名的文件被移动到根 hello-images/ 目录中。
  • @Adrian 不要硬编码,现在检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多