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

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

我有很多名为

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 命令指定我想要删除所有以前缀“sequence_1”开头并以“.hmf”结尾的内容?

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

答案1

rm sequence_1*.hmf

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


通配符是 shell 获取模式并将其扩展为与该模式匹配的文件名列表的过程。不要将其与正则表达式混淆,正则表达式是不同的。如果您大部分时间都花在bash,Wooledge Wiki 有一个很好的通配符页面(路径名扩展)。如果您想要最大的便携性,您需要阅读模式匹配的 POSIX 规范以及/代替。


在不太可能的情况下,您会遇到“参数列表太长”错误,你可以看一下Bash常见问题解答 95,解决了这个问题。最简单的解决方法是将全局模式分解为多个较小的块,直到错误消失。在您的情况下,您可能可以通过前缀数字 0 到 9 来分割匹配,如下所示:

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

答案2

尽管 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,它当然支持这些选项。

答案3

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

在 Bash 中也可以工作。

相关内容