我有许多不同扩展名(jpeg、jpg、png)的图像,它们包含在许多不同的目录中,其中许多图像可能包含在其他文件夹中以便组织。
例如:
Folder 1/
Folder A/
Image 01.jpg
Image 02.png
Folder 2/
Folder B/
Folder C/
Image 03.jpeg
Image 04.png
层次结构和文件夹会根据我正在处理的内容而变化。我通常需要附加图像父文件夹作为前缀,并为页面添加数字后缀,例如 Page 001、002 等。
我通常使用 Pyrenamer 程序进入每个文件夹并批量命名文件夹中的所有图像,但这需要花费大量时间。例如,50 个文件夹有 50 个作业。
我知道可以编写一个脚本(最好是 nautilus 脚本),我可以在包含多个文件夹的单个文件夹上使用该脚本来完成作业。
例如,“Image 01.jpg”将被重命名为“Folder A - Page 001.jpg”,而“Image 04.png”将被重命名为“Folder C - Page 004.png”。图像的顺序是特定的,需要按照与之前相同的顺序重命名和编号,只需使用适当的前缀和后缀即可。
Pyrenamer 可以完成后缀,但只允许使用当前目录(而不是父目录)重命名,因此所需的前缀毫无用处。
我的终端知识有限,编程知识也有限。任何帮助都将不胜感激,这将大大加快我的工作流程。
答案1
该bash
脚本应该执行以下操作:要操作的路径必须作为参数传递给它(这是故意的),例如:
./script.sh <directory>
#!/bin/bash
while read filepath
do
newpath="$(<<< "$filepath" sed 's/^\(.*\)\/\(.*\)\/[^ ]*\(.*\)$/\1\/\2\/Folder \2 - Page 0\3/')"
mv "$filepath" "$newpath"
done <<< "`find $1 -type f \( -iname '*.png' -o -iname '*.jpeg' -o -iname '*.jpg' \)`"
前:
<目录> │ │ f1 │ │ ── 图片01.png │ │ ── 图片02.png │ └── 图片03.jpeg │ │ │ │ └── f2.1 │ │ ── 图片04.jpeg │ │ ── 图片05.jpg │ └── 图片06.jpg └── f3 └── f3.1 └── f3.1.1 │ ── 图片07.png │ ── 图片08.png └── 图片09.jpeg
后:
<目录> │ │ f1 │ ═── 文件夹f1 - 第001页.png │ ═── 文件夹f1 - 第002页.png │ └── 文件夹 f1 - 第 003 页.jpeg │ │ │ │ └── f2.1 │ ═ ... │ ═ ... │ └── 文件夹 f2.1 - 第 006 页.jpg └── f3 └── f3.1 └── f3.1.1 ── 文件夹 f3.1.1 - 第 007 页.png ── 文件夹f3.1.1 - 第008页.png └── 文件夹 f3.1.1 - 第 009 页.jpeg
答案2
假设文件夹包含仅有的您要重命名的文件,并且您正在使用 bash:
$ shopt -s globstar
$ rename -n 's;/([^/]*)/([^/]*) (\d+)\.(\w+)$;sprintf("/%s/%s - Page %03d.%s", $1, $1, $3, $4);e' ./Folder*/**/*
./Folder 2/Folder B/Folder C/Image 03.jpeg renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 003.jpeg
./Folder 2/Folder B/Folder C/Image 04.png renamed as ./Folder 2/Folder B/Folder C/Folder C - Page 004.png
./Folder A/Image 01.jpg renamed as ./Folder A/Folder A - Page 001.jpg
./Folder A/Image 02.png renamed as ./Folder A/Folder A - Page 002.png
rename
是一个 Perl 脚本,对于重命名文件非常有用。在本例中,我使用了一个正则表达式:
/([^/]*)/
- 匹配目录组件,以斜线为界。([^/]*)
- 匹配文件名的前缀,后跟一个空格(\d+)
- 匹配文件名中的数字\.(\w+)
- 匹配扩展名$
全部固定在文件名的末尾。
然后我使用sprintf
以所需方式打印匹配的值。改变 3 以%03d
获得更多填充。
in**
是./Folder*/**/*
一个递归全局,这就是我需要启用的原因globstar
。