可能重复:
Renaming lots of files in Linux according to a pattern
我有多种格式的文件:
file_1.pdf
file_2.pdf
...
file_100.pdf
我的问题是如何重命名所有文件,如下所示:
file_001.pdf
file_002.pdf
...
file_100.pdf
我知道您可以使用'rename'重命名多个文件,但在这种情况下我不知道如何执行此操作。
答案 0 :(得分:13)
您可以使用shell
提示符中的Perl工具rename
执行此操作。 (还有其他同名的工具可能会或可能不会这样做,所以要小心。)
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
或更多:+
中的$1
sprintf("%03d", $1)
sprintf
与printf
类似,但不习惯打印,而是格式化具有相同语法的字符串。 %03d
用于零填充,$1
是捕获的字符串。查看perldoc -f sprintf
e
修饰符 ,答案 1 :(得分:2)
如果你想用纯粹的bash做到这一点:
for f in file_*.pdf; do x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; done
(请注意调试 echo )