重命名多个文件的shell
我在一个目录中有多个文件,例如: linux_file1.mp4
, linux_file2.mp4
等等。 如何使用shell移动这些文件,以便名称是file1.mp4
, file2.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重命名它将无害地报告和未知的选项,并显示使用情况。
如果你没有rename
或mmv
,不想或者不能安装它们,你仍然可以用普通的旧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