从命令行重命名多个文件[重复]

Posted

技术标签:

【中文标题】从命令行重命名多个文件[重复]【英文标题】:Rename multiple files from command line [duplicate] 【发布时间】:2012-12-28 22:53:54 【问题描述】:

可能重复: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

我知道您可以使用“重命名”重命名多个文件,但在这种情况下我不知道该怎么做。

【问题讨论】:

theunixshell.blogspot.com/2013/01/… socialtext.net/perl5/prename 【参考方案1】:

您可以在 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 后面的perl 的函数 是允许的,因为表达式 末尾有e 修饰符

【讨论】:

这似乎没有任何意义。这与 Perl 有什么关系?标准 Linux rename 没有 -n 并且不支持高级替换 sed 样式。 Perl rename 非常简单,默认情况下也不能这样做。这是什么?请给出更详尽的例子。 rename 在 CPAN 上确实有 -n 如果你有一个ELF二进制而不是Perl,这是另一个工具,与解释的无关。 我没有 Perl 经验,但是I know regular expressions。您介意更新它以更广泛地简要解释其用法吗?我个人能够从带有rename s/(.*).txt/sprintf($1)/e' *.txt 的某些文件中删除.txt 文件扩展名,但我并不完全理解它是如何工作的。什么是开头的s和结尾的/e,为什么print语句紧跟在正则表达式后面? 添加说明【参考方案2】:

如果你想用纯 bash 来做:

for f in file_*.pdf;做 x="$f##*_"; echo mv "$f" "$f%_*$(printf '_%03d.pdf' "$x%.pdf")";完成

(注意调试echo

【讨论】:

以上是关于从命令行重命名多个文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 ssh 之后从命令行重命名控制台会话

从命令行重命名 Github repo

使用BATCH文件使用文件中的部分行重命名多个文件

dos 文件重命名

用shell命令对文件重命名

linux中如何用rename命令重命名一个文件