从命令行重命名多个文件

4
我是一名有用的助手,可以为您翻译文本。
以下是需要翻译的内容:

可能重复:
根据模式在Linux中重命名大量文件

我有多个文件,格式如下:

file_1.pdf
file_2.pdf
...
file_100.pdf

我的问题是如何重命名所有看起来像这样的文件:
file_001.pdf
file_002.pdf
...
file_100.pdf

我知道你可以用“rename”重命名多个文件,但我不知道在这种情况下该怎么做。


http://theunixshell.blogspot.com/2013/01/bulk-renaming-of-files-in-unix.html - Vijay
https://www.socialtext.net/perl5/prename - daxim
2个回答

13

您可以使用Perl工具renameshell提示符执行此操作。 (还有其他同名工具,可能能够执行此操作,但请小心。)

rename 's/(\d+)/sprintf("%03d", $1)/e' *.pdf

如果您想要进行模拟操作以确保不会覆盖任何文件,请在命令中添加-n开关。

注意

如果您运行以下命令(linux

$ file $(readlink -f $(type -p rename))

那么你会得到一个类似于以下结果

.../rename: Perl script, ASCII text executable

那么这似乎是正确的工具 =)

这似乎是在 Ubuntu 上默认的 rename 命令。

要使其成为 Debian 和衍生版本(如 Ubuntu)的默认命令:

sudo update-alternatives --set rename /path/to/rename

解释

  • s/// 是基本的替换表达式: s/被替换的字符串/替换成的字符串/,参考 perldoc perlre
  • (\d+) 使用()捕获至少一个整数:\d+,在$1中返回
  • sprintf("%03d", $1) sprintf 类似于 printf,但不是用于打印,而是用于以相同的语法格式化字符串。 %03d 用于零填充,$1是被捕获的字符串。请参考 perldoc -f sprintf
  • 后面的perl函数是被允许的,因为在表达式的末尾有e修饰符。

这似乎没有任何意义。这与Perl有什么关联?标准Linux rename 没有 -n,也不支持高级替换sed风格操作。Perl的 rename 非常简单,默认情况下也无法执行此操作。这是什么?请提供更详细的示例。 - mvp
CPAN上的rename命令确实有-n选项。 - ikegami
如果你有一个ELF二进制文件而不是Perl,那么这是另一个工具,与所解释的工具无关。 - Gilles Quénot
我没有Perl的经验,但是我知道正则表达式。您介意更新一下以更广泛地解释它的用法吗?我个人能够使用“rename s/(.*).txt/sprintf($1)/e' *.txt”从一些文件中删除“.txt”文件扩展名,但我不完全明白它是如何工作的。“s”开头和“/e”结尾是什么意思,为什么在正则表达式之后立即有一个打印语句? - Keavon
添加了解释 - Gilles Quénot

1
如果您想要使用纯Bash完成此操作:
for f in file_*.pdf; do x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; done
(请注意调试中的echo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接