![重命名偶数文件](https://linux22.com/image/34399/%E9%87%8D%E5%91%BD%E5%90%8D%E5%81%B6%E6%95%B0%E6%96%87%E4%BB%B6.png)
我收集了一些书籍扫描页的图像。它们总共约有 10,000 页。这些书是双语印刷的,文本和译文都在对页上。译文已被丢弃,只有原文页,即偶数页。
我需要文件名包含正确的页码,而目前它们的顺序很简单。很高兴使用rename
或类似。
为了明确起见,我们目前的文件编号格式如下:
1-001.png
1-002.png
1-003.png
...
其中第一个数字1是卷号;这是保持不变。第二个数字是页码,需要更改为:
1-002.png
1.004.png
1-006.png
...
答案1
这是重命名命令:
rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png
结果:
1-001.png renamed as 1-0002.png
1-002.png renamed as 1-0004.png
1-003.png renamed as 1-0006.png
1-004.png renamed as 1-0008.png
1-005.png renamed as 1-0010.png
...
2-001.png renamed as 2-0002.png
2-002.png renamed as 2-0004.png
2-003.png renamed as 2-0006.png
2-004.png renamed as 2-0008.png
2-005.png renamed as 2-0010.png
-n, --无行为 无操作:显示哪些文件将被重命名。
我our $i
定义了一个Perl 全局变量我用 来设置它的值2
。
(\d+)-(\d+)
:(\d+)
将文件名的开头与一个或多个数字匹配,并将其作为组捕获和一-
;然后再次(\d+)
匹配文件名中破折号()之后的任何数字-
,并将其作为组捕获。
^
在开头^(\d+)-(\d+)
确保避免/跳过重命名文件,如果它们不是^
以类似数字开始()a11.001.png
,并且仅当文件以 开头时才重命名文件digit-digit.png
。
sprintf("$1-%04d", $i*$2)
:首先打印带有索引$1
(或其后向引用)的组捕获(请参阅第一个(\d+)
) ,然后打印最大 4 字段宽度( )^(\d+)-(\d+)
的组的新计算值,并用 0s()填充空字段。$2
%4d
%04d
注意:为什么我%04d
在sprintf
命令中使用,因为当你想重命名1-001.png
为时1-002.png
,文件1-002.png
已经存在并且你不能重命名它。因此,我在第二个字段的前面添加了一个额外的零,以避免出现此错误。
或者正如 @muru 建议的那样,您可以使用反向引用而不是全局变量
rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png
$1
是 first 的反向引用(\d+)
,$2
是 secondary 的反向引用(\d+)
。请注意,您必须使用一对括号(group)
将其作为组捕获。
最后,您可以-n
从命令中删除选项来重命名您的文件。
答案2
假设您要将每个页码乘以 2,
#!/bin/sh
tmpext=tmpext # temporary extension to avoid clobbering existing files
# double the page number and change .png to tmpext
for page in ./*-[[:digit:]][[:digit:]][[:digit:]].png; do
vol=${page%-*}
num=${page#$vol-}
num=${num%.png}
zeroes=${num%%[!0]*}
num=${num#$zeroes}
tmppage=${vol}-$(printf %.3d $((num * 2))).$tmpext
mv -vi "$page" "$tmppage"
done
# move .tmpext back to .png
for tmppage in ./*."$tmpext"; do
mv -vi "${tmppage}" "${tmppage%$tmpext}png"
done