从命令行重命名多个文件

Sim*_*ier 3 bash perl rename file-rename

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

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

file_1.pdf
file_2.pdf
...
file_100.pdf
Run Code Online (Sandbox Code Playgroud)

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

file_001.pdf
file_002.pdf
...
file_100.pdf
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*not 13

您可以使用Perl的工具做到这一点renameshell提示.(还有其他具有相同名称的工具可能会或可能不会这样做,所以要小心.)

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

如果要进行空运行以确保不破坏任何文件,请将-n开关添加到命令中.

注意

如果运行以下命令(linux)

$ file $(readlink -f $(type -p rename))
Run Code Online (Sandbox Code Playgroud)

你有一个结果

.../rename: Perl script, ASCII text executable
Run Code Online (Sandbox Code Playgroud)

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

这似乎是默认rename命令Ubuntu.

要使它成为默认值Debian并衍生出来Ubuntu:

sudo update-alternatives --set rename /path/to/rename
Run Code Online (Sandbox Code Playgroud)

说明

  • s///是基本替换表达式:s/to_replace/replaced/,检查perldoc perlre
  • (\d+)使用()至少一个整数捕获:\d或更多:+in$1
  • sprintf("%03d", $1) sprintf是像printf的,但不是用来打印,但要格式化具有相同语法的字符串.%03d用于零填充,并且$1是捕获的字符串.校验perldoc -f sprintf
  • 由于表达式末尾的修饰符,后来的perl函数被允许e