我有一个目录里有多个文件,例如: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:
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 的标准。
$foo
或${foo}
进行扩展(它们是等效的),这被称为参数扩展,但使用花括号的版本允许在扩展时修改值,这被称为参数替换。bash实现包括标准不要求的替换。请记住始终完整引用您的变量扩展,否则会导致意外结果! - sorpigalmmv
的软件包是什么? - Alexej Magurammv
的软件包。我无法评论其他发行版。 - sorpigalrename
(已经安装在Slackware上)以及关于名称冲突的解释!man rename
也很有帮助。 - DaveGauer$ rename 's/linux_//' linux_*.mp4
一种简单的本地方式是使用目录遍历:
find -type f | xargs -I {} mv {} {}.txt
将每个文件都重命名,末尾添加扩展名 .txt。
更通用的酷炫方法,使用并行处理:
find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:10}trump${f:4}'
通过结合@dtrckd和@Sorpigal的答案,我能够实现对目录中文件名的替换。
for file in `find -name "linux_*.mp4"`; do mv "$file" "${file/linux_/}" ; done