我有很多文件名
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
,它当然支持这些选项。
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 中也能工作。