我有很多名为
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 中也可以工作。