linux - 批量重命名图片为文件夹名+序号

标签 linux bash

<分区>

我想将包含子目录的目录中的文件重命名为父目录名称+序号。

例如:

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

最佳答案

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

关于linux - 批量重命名图片为文件夹名+序号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40808695/

相关文章:

bash - 从某些文件读取时连接字符串失败

linux - 更改多个文件中的一行

c++ - SIEM 通过 TCP 进行流式传输,将多条消息放入一个事件中

c - 为什么 printf 在多线程程序中不起作用?

linux - 为什么这个命令会杀死我的 shell?

node.js - 使用 NVM 设置 Node 版本或安装(如果不可用)。

linux - 查找 Linux 服务器磁盘空间详细信息

php - 将 Linux 服务器上的 PHP 连接到运行 Windows 的远程服务器上的 MS SQL

linux - 使用 Bash 启动和停止 openconnect

python - access(2) vs stat(2) 检查文件是否可执行