从命令行重命名多个文件

时间:2013-01-14 22:05:22

标签: perl bash rename file-rename

  

可能重复:
  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'重命名多个文件,但在这种情况下我不知道如何执行此操作。

2 个答案:

答案 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) sprintfprintf类似,但不习惯打印,而是格式化具有相同语法的字符串。 %03d用于零填充,$1是捕获的字符串。查看perldoc -f sprintf
  • 由于表达式末尾的e修饰符
  • 后来的 perl函数被授予

答案 1 :(得分:2)

如果你想用纯粹的bash做到这一点:

for f in file_*.pdf; do x="${f##*_}"; echo mv "$f" "${f%_*}$(printf '_%03d.pdf' "${x%.pdf}")"; done

(请注意调试 echo