【发布时间】:2012-12-28 22:53:54
【问题描述】:
我有多个这种格式的文件:
file_1.pdf
file_2.pdf
...
file_100.pdf
我的问题是如何重命名所有文件,如下所示:
file_001.pdf
file_002.pdf
...
file_100.pdf
我知道您可以使用“重命名”重命名多个文件,但在这种情况下我不知道该怎么做。
【问题讨论】:
标签: perl bash rename file-rename
我有多个这种格式的文件:
file_1.pdf
file_2.pdf
...
file_100.pdf
我的问题是如何重命名所有文件,如下所示:
file_001.pdf
file_002.pdf
...
file_100.pdf
我知道您可以使用“重命名”重命名多个文件,但在这种情况下我不知道该怎么做。
【问题讨论】:
标签: perl bash rename file-rename
您可以在 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
那么这似乎是正确的工具 =)
这似乎是Ubuntu 上的默认rename 命令。
使其成为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 修饰符
【讨论】:
rename 没有 -n 并且不支持高级替换 sed 样式。 Perl rename 非常简单,默认情况下也不能这样做。这是什么?请给出更详尽的例子。
rename 在 CPAN 上确实有 -n。
ELF二进制而不是Perl,这是另一个工具,与解释的无关。
rename s/(.*).txt/sprintf($1)/e' *.txt 的某些文件中删除.txt 文件扩展名,但我并不完全理解它是如何工作的。什么是开头的s和结尾的/e,为什么print语句紧跟在正则表达式后面?
如果你想用纯 bash 来做:
for f in file_*.pdf;做 x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")";完成
(注意调试echo)
【讨论】: