我有一个目录,我需要删除目录名称中包含空格和数字的所有子目录。我将如何匹配给定参数的模式?我需要用一个 rm 命令来做到这一点。 谢谢
最佳答案
只需在同一个 rm
命令中包含两个模式:
rm -rf -- \
*" "*[0-9]*/ \ # this one gets directories with spaces before numbers...
*[0-9]*" "*/ # ...and this one gets directories with numbers before spaces.
如果两个类中只有一个存在,则不存在的类不会展开(除非启用了 nullglob
shell 选项)。不过,这是无害的,因为 rm -f
会忽略不存在的参数。因此,假设您有一个文件 foo 5
,但没有数字后跟空格的文件。当您运行它时,shell 将执行以下操作:
rm -rf -- "foo 5" "*[0-9]* */"
...这对 rm
是无害的,但可能会给非 rm
程序带来一些麻烦,因为它需要传递给它的所有参数都存在。
要解决这个问题,请启用 nullglob
选项:
shopt -s nullglob
...然后任何不匹配的模式将被简单地删除。
另一个有趣的例子是当您想要避免重复 名称时。例如,client 15 jenkins
匹配 *""*[0-9]*
和 *[0-9]*""*
, 所以如果你把这两个模式放在一行中,你会得到该文件列出两次。您可以使用 bash extglobs 避免这种情况:
shopt -s extglob # turn on extended globbing
rm -rf -- *@([0-9]*" "|" "*[0-9])*/ # ...and now this will only emit one result
关于Bash 模式匹配与 rm 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24462413/