查找图像文件名并使用父文件夹名称重命名

查找图像文件名并使用父文件夹名称重命名

我有这个文件结构。我想使用附加了父文件夹名称的图像文件名。

前:

├── ak
│   ├── adak
│   │   ├── Hello\ World456
│   │   ├── cup-printing
│   │   │   └── Tshirt-printing.jpg
│   │   ├── hello-\ world789
│   │   ├── hello-world79
│   │   └── tshirt\ printing
│   │       └── Tshirt-printing.jpg
│   ├── akhiok
│   │   ├── Hello\ World456
│   │   ├── cup-printing
│   │   │   └── Tshirt-printing.jpg
│   │   ├── hello-\ world789
│   │   ├── hello-world79
│   │   └── tshirt\ printing
│   │       └── Tshirt-printing.jpg

此处的父文件夹名称是 ak、adak。

Ak= 州名 Adak = 城市名称。

之后应该是这样的..

后:


├── ak
│   ├── adak
│   │   ├── Hello\ World456
│   │   ├── cup-printing
│   │   │   └── Tshirt-printing-adak-ak.jpg
│   │   ├── hello-\ world789
│   │   ├── hello-world79
│   │   └── tshirt\ printing
│   │       └── Tshirt-printing-adak-ak.jpg
│   ├── akhiok
│   │   ├── Hello\ World456
│   │   ├── cup-printing
│   │   │   └── Tshirt-printing-akhiok-ak.jpg
│   │   ├── hello-\ world789
│   │   ├── hello-world79
│   │   └── tshirt\ printing
│   │       └── Tshirt-printing-akhiok-ak.jpg

Bash 命令可以在这里帮忙吗?

非常感谢您的帮助。

提前致谢。 :)

答案1

尝试这个,

find . -name "*.jpg" -exec sh -c '
  suffix=$(printf "%s" "$1" | awk -F"/" "{for(i=NF-2;i>1;i--)printf \"-\"\$i;}");
  echo mv "$1" "${1%.*}${suffix}.${1##*.}";
' find-sh {} \;
  1. 请尝试理解这是什么意思。
  2. 确保路径不包含换行符,否则命令awk将失败。
  3. 如果您对输出满意,请删除echo以执行该命令。mv

答案2

使用 perl-rename( sudo apt install rename):

rename -n 's/(.+)\/(.+)\/.+\/[^.]+/$&-$2-$1/' ak/*/*/*.jpg

此命令必须在ak的父目录中启动。它将s扩展点之前的路径替换为自身,后跟第二个目录名,然后是第一个目录名,每个目录名都用连字符分隔。它只-n打印它想要执行的操作,删除此选项以执行重命名。

解释

  • s/a/b/– 替换ab
  • (.+)\/匹配至少一个字符,将其保存在一个组中,并且/必须使用反斜杠进行转义\
  • .+\/无需将其保存在组中,我们不再需要第三个目录
  • [^.]+匹配至少一个非点字符 - 这会匹配任何文件名直到第一个点(请注意,这意味着您的文件名中不能有除扩展名点之外的任何其他点!)
  • $&-$2-$1= 整个匹配的字符串-第二组-第一组

示例运行

$ tree ak
ak
├── adak
│   ├── cup-printing
│   │   └── Tshirt-printing.jpg
│   └── tshirt printing
│       └── Tshirt-printing.jpg
└── akhiok
    ├── cup-printing
    │   └── Tshirt-printing.jpg
    └── tshirt printing
        └── Tshirt-printing.jpg

6 directories, 4 files
$ rename -n 's/(.+)\/(.+)\/.+\/[^.]+/$&-$2-$1/' ak/*/*/*.jpg
rename(ak/adak/cup-printing/Tshirt-printing.jpg, ak/adak/cup-printing/Tshirt-printing-adak-ak.jpg)
rename(ak/adak/tshirt printing/Tshirt-printing.jpg, ak/adak/tshirt printing/Tshirt-printing-adak-ak.jpg)
rename(ak/akhiok/cup-printing/Tshirt-printing.jpg, ak/akhiok/cup-printing/Tshirt-printing-akhiok-ak.jpg)
rename(ak/akhiok/tshirt printing/Tshirt-printing.jpg, ak/akhiok/tshirt printing/Tshirt-printing-akhiok-ak.jpg)
$ ^-n^^     # ← this prints and runs the former command line without “-n”
rename  's/(.+)\/(.+)\/.+\/[^.]+/$&-$2-$1/' ak/*/*/*.jpg
$ tree ak
ak
├── adak
│   ├── cup-printing
│   │   └── Tshirt-printing-adak-ak.jpg
│   └── tshirt printing
│       └── Tshirt-printing-adak-ak.jpg
└── akhiok
    ├── cup-printing
    │   └── Tshirt-printing-akhiok-ak.jpg
    └── tshirt printing
        └── Tshirt-printing-akhiok-ak.jpg

6 directories, 4 files

相关内容