重命名偶数文件

重命名偶数文件

我收集了一些书籍扫描页的图像。它们总共约有 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

注意:为什么我%04dsprintf命令中使用,因为当你想重命名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

相关内容