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

Pau*_*aul 24 files

我有很多文件名

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...
Run Code Online (Sandbox Code Playgroud)

和文件名

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...
Run Code Online (Sandbox Code Playgroud)

和文件名

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...
Run Code Online (Sandbox Code Playgroud)

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...
Run Code Online (Sandbox Code Playgroud)

我只想删除以“sequence_1”开头并以“.hmf”结尾的文件,但我不想将它们一一删除,因为有数千个文件。如何向 rm 命令指定要删除所有以前缀“sequence_1”开头并以“.hmf”结尾的内容?

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

jw0*_*013 31

rm sequence_1*.hmf
Run Code Online (Sandbox Code Playgroud)

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


Globbing 是 shell 获取模式并将其扩展为与该模式匹配的文件名列表的过程。不要将它与不同的正则表达式混淆。如果您大部分时间都花在bash,Wooledge Wiki 上有一个关于 globbing(路径名扩展)的好页面。如果您想要最大的可移植性,您还需要阅读有关模式匹配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
Run Code Online (Sandbox Code Playgroud)


Use*_*ess 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
Run Code Online (Sandbox Code Playgroud)

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

  • 如果可以,请使用 -delete 选项进行查找,它不会为每个文件分叉... (2认同)

use*_*own 5

rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...
Run Code Online (Sandbox Code Playgroud)

在 Bash 中也能工作。