可能重复:
根据模式在 Linux 中重命名大量文件
我有多个这种格式的文件:
file_1.pdf
file_2.pdf
...
file_100.pdf
我的问题是如何重命名所有文件,如下所示:
file_001.pdf
file_002.pdf
...
file_100.pdf
我知道您可以使用“重命名”重命名多个文件,但在这种情况下我不知道该怎么做。
可能重复:
根据模式在 Linux 中重命名大量文件
我有多个这种格式的文件:
file_1.pdf
file_2.pdf
...
file_100.pdf
我的问题是如何重命名所有文件,如下所示:
file_001.pdf
file_002.pdf
...
file_100.pdf
我知道您可以使用“重命名”重命名多个文件,但在这种情况下我不知道该怎么做。
您可以rename
在shell
提示符下使用 Perl 工具执行此操作。(还有其他同名的工具可能会也可能不会这样做,所以要小心。)
rename 's/(\d+)/sprintf("%03d", $1)/e' *.pdf
如果您想进行试运行以确保不会破坏任何文件,请将-n
开关添加到命令中。
如果您运行以下命令 ( linux
)
$ file $(readlink -f $(type -p rename))
你有一个像
.../rename: Perl script, ASCII text executable
那么这似乎是正确的工具=)
这似乎rename
是Ubuntu
.
使其成为默认值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
e
如果你想用纯 bash 来做:
对于文件中的 f_*.pdf;做 x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; 完毕
(注意调试回声)