重命名多个文件的shell

我在一个目录中有多个文件,例如: linux_file1.mp4linux_file2.mp4等等。 如何使用shell移动这些文件,以便名称是file1.mp4file2.mp4等。 我有大约30个文件,我想移动到新名称。

我喜欢mmv这种东西

 mmv 'linux_*' '#1' 

但是你也可以使用rename 。 请注意,通常有两个rename命令,语法非常不同。 一个是用Perl写的,另一个是用util-linux发布的,所以我把它们区分为下面的“perl rename”和“util rename”。

用Perl重命名:

 rename 's/^linux_//' linux_*.mp4 

正如cweiske正确指出的那样。

随着util重命名:

 rename linux_ '' linux_*.mp4 

你怎么知道你有哪个重命名? 尝试运行rename -V ; 如果你的版本是util重命名它将打印版本号,如果它是perl重命名它将无害地报告和未知的选项,并显示使用情况。

如果你没有renamemmv ,不想或者不能安装它们,你仍然可以用普通的旧shell代码来完成:

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

这个语法将适用于符合XPG4或更高版本的任何POSIX sh,而这些基本上是所有shell。

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

一个简单的本地方式来做到这一点, 目录遍历

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

将最后重命名每个文件join扩展名.txt。

而一个更普遍的并行化很酷的方式:

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

我能够通过结合@dtrckd和@Sorpigal答案来实现replace目录中的文件名。

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