从命令行重命名多个文件[重复]
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 有什么关系?标准 Linuxrename
没有 -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)
【讨论】:
以上是关于从命令行重命名多个文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章