在shell中重命名多个文件

67

我有一个目录里有多个文件,例如:linux_file1.mp4linux_file2.mp4等等。我该如何使用Shell移动这些文件,使它们的名称变成file1.mp4file2.mp4等等。我有大约30个文件要移动到新名称。


相关问题:基于多个模式重命名文件的更好方法 - Michaël Le Barbier
4个回答

116

对于这种事情,我喜欢使用mmv

mmv 'linux_*' '#1'

但是你也可以使用rename命令。请注意,通常有两种具有非常不同语法的rename命令。其中一个是用Perl编写的,另一个是与util-linux一起分发的,因此我在下面将它们区分为“perl rename”和“util rename”。

使用Perl rename:

rename 's/^linux_//' linux_*.mp4
的确指出了。
使用:
rename linux_ '' linux_*.mp4

如何确定您使用的是哪个版本的rename? 尝试运行rename -V; 如果您的版本是util rename,则它将打印版本号,如果是perl rename,则它将无害地报告一个未知选项并显示用法。

如果您既没有rename也没有mmv,并且不想或无法安装它们,则仍然可以使用普通的shell代码来完成此操作:

for file in linux_*.mp4 ; do mv "$file" "${file#linux_}" ; done

这个语法适用于符合 XPG4 或更高标准的 POSIX sh,这基本上是现今所有 shell 的标准。


提供的链接是404错误。 - xApple
1
你能解释一下这个语法:${file#linux_}吗?我有类似的情况,但是我想把*_32.png改成*_24.png。 - catalyst294
2
@catalyst294:Shell变量可以使用$foo${foo}进行扩展(它们是等效的),这被称为参数扩展,但使用花括号的版本允许在扩展时修改值,这被称为参数替换bash实现包括标准不要求的替换。请记住始终完整引用您的变量扩展,否则会导致意外结果! - sorpigal
通常提供mmv的软件包是什么? - Alexej Magura
@AlexejMagura:Debian也提供了一个名为mmv的软件包。我无法评论其他发行版。 - sorpigal
感谢您提供的rename(已经安装在Slackware上)以及关于名称冲突的解释!man rename也很有帮助。 - DaveGauer

18
$ rename 's/linux_//' linux_*.mp4

6

一种简单的本地方式是使用目录遍历

find -type f | xargs -I {} mv {} {}.txt

将每个文件都重命名,末尾添加扩展名 .txt。

更通用的酷炫方法,使用并行处理

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:10}trump${f:4}'

5

通过结合@dtrckd和@Sorpigal的答案,我能够实现对目录中文件名的替换。

for file in `find -name "linux_*.mp4"`; do mv "$file" "${file/linux_/}" ; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接