3

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

我有多个这种格式的文件:

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

我的问题是如何重命名所有文件,如下所示:

file_001.pdf
file_002.pdf
...
file_100.pdf

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

4

2 回答 2

13

您可以renameshell提示符下使用 Perl 工具执行此操作。(还有其他同名的工具可能会也可能不会这样做,所以要小心。)

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

如果您想进行试运行以确保不会破坏任何文件,请将-n开关添加到命令中。

笔记

如果您运行以下命令 ( linux)

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

你有一个像

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

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

这似乎renameUbuntu.

使其成为默认值Debian和派生值,例如Ubuntu

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

解释

  • s///是基本替换表达式:s/to_replace/replaced/,检查perldoc perlre
  • (\d+)()用至少一个整数捕获:\d或更多:+in$1
  • sprintf("%03d", $1) sprintf类似printf,但不用于打印,而是用相同的语法格式化字符串。%03d用于零填充,并且$1是捕获的字符串。查看perldoc -f sprintf
  • 由于表达式末尾的修饰符,允许后面的 perl 函数e
于 2013-01-14T22:07:49.257 回答
2

如果你想用纯 bash 来做:

对于文件中的 f_*.pdf;做 x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; 完毕

(注意调试回声

于 2013-01-15T00:16:11.280 回答