我有这个文件结构。我想使用附加了父文件夹名称的图像文件名。
前:
├── 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 {} \;
- 请尝试理解这是什么意思。
- 确保路径不包含换行符,否则命令
awk
将失败。 - 如果您对输出满意,请删除
echo
以执行该命令。mv
答案2
使用 perl-rename( sudo apt install rename
):
rename -n 's/(.+)\/(.+)\/.+\/[^.]+/$&-$2-$1/' ak/*/*/*.jpg
此命令必须在ak
的父目录中启动。它将s
扩展点之前的路径替换为自身,后跟第二个目录名,然后是第一个目录名,每个目录名都用连字符分隔。它只-n
打印它想要执行的操作,删除此选项以执行重命名。
解释
s/a/b/
– 替换a
为b
(.+)\/
匹配至少一个字符,将其保存在一个组中,并且/
必须使用反斜杠进行转义\
.+\/
无需将其保存在组中,我们不再需要第三个目录[^.]+
匹配至少一个非点字符 - 这会匹配任何文件名直到第一个点(请注意,这意味着您的文件名中不能有除扩展名点之外的任何其他点!)$&-$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