【发布时间】:2011-10-18 04:27:23
【问题描述】:
我在一个目录中有多个文件,例如:linux_file1.mp4、linux_file2.mp4 等等。如何使用 shell 移动这些文件,以便名称为 file1.mp4、file2.mp4 等。我有大约 30 个文件要移动到新名称。
【问题讨论】:
我在一个目录中有多个文件,例如:linux_file1.mp4、linux_file2.mp4 等等。如何使用 shell 移动这些文件,以便名称为 file1.mp4、file2.mp4 等。我有大约 30 个文件要移动到新名称。
【问题讨论】:
$ rename 's/linux_//' linux_*.mp4
【讨论】:
我喜欢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 rename ,它将打印版本号,如果是 perl rename ,它将无害地报告和未知选项并显示使用情况。
如果您没有 rename 或 mmv 并且不想或无法安装它们,您仍然可以使用普通的旧 shell 代码完成此操作:
for file in linux_*.mp4 ; do mv "$file" "${file#linux_}" ; done
这种语法适用于任何符合 XPG4 或更高版本的 POSIX sh,这些天基本上都是 shell。
【讨论】:
$foo 或${foo} 扩展(它们是等价的),这称为参数扩展,但带有花括号的版本允许修改值扩展时间,这称为parameter substitution。 bash 实现包括标准不需要的替换。请记住始终全引用您的变量扩展,否则会遭受意外结果!
mmv一般提供什么包?
mmv 的包中提供了它。我无法评论其他发行版。
使用目录遍历的简单原生方式:
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
【讨论】: