如何删除具有共同前缀和后缀的多个文件?


21

我有很多文件名为

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

和文件名为

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

和文件名为

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

我只想删除以“ sequence_1”开头并以“ .hmf”结尾的文件,但是由于有成千上万个文件,所以我不想一一删除。如何为rm命令指定要删除所有以prefilx'sequence_1'开头并以'.hmf'结尾的所有内容?

我目前正在使用RedHat Linux系统,但是我也想知道如何在其他发行版上进行操作。

Answers:


28
rm sequence_1*.hmf

删除以开头sequence_1和结尾的文件.hmf


globbing是您的shell采取模式并将其扩展为与该模式匹配的文件名列表的过程。不要将它与正则表达式混淆,正则表达式是不同的。如果您将大部分时间都花在了bash该网站上,那么Wooledge Wiki上的globing (路径名扩展)页面很好。如果您希望获得最大的可移植性,则还需要阅读POSIX关于模式匹配的规范


极少数情况下,您遇到“参数列表过长”错误,可以看看BashFAQ 95,它解决了这个问题。最简单的解决方法是将glob模式分解为多个较小的块,直到错误消失。在您的情况下,您可能可以按以下方式将匹配项按前缀数字0到9进行拆分:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

这是解决“参数列表过长”错误的非常巧妙的方法。就我而言,我有两万个文件,所以我想我必须使用从0,..,20开始的for循环。对?
保罗

@Paul对,只要将列表分成所需的多个块即可,尽管在某些时候该find方法比猜测和检查变得容易。
2012年

14

尽管jw013的答案是正确的,但是如果您有成千上万的匹配项,该命令可能会失败:展开的命令行 rm sequence_1_0001.hmf sequence_1_0002.hmf ... shell生成可能只是太大了。

正如Dom所建议的那样,您还可以将-delete选项与结合使用find

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

无论-maxdepth-delete,而不是在POSIX标准中是相当普遍的find在野外的实现。Linux发行版通常使用GNU find,它当然支持这些选项。


2
如果可以,请使用-delete选项进行查找,它不会为每个文件分叉...
Dom 2012年

添加,欢呼。看起来是-delete应该在最新的GNU BSD系统上得到支持,而-print0仅GNU。因此,它也可能更具可移植性(尽管它对OP不会有什么影响)。
没用的2012年

至少OS X的查找具有-print0,但不包含在POSIX中。
Lri

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

在Bash中也可以使用。


大括号扩展需要bash,零填充格式需要版本4,我相信。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.