Bash模式与rm命令匹配

时间:2014-06-28 00:22:06

标签: bash

我有一个目录,我需要删除所有包含空格和目录名中的数字的子目录。我如何模式匹配给定的参数?我需要用一个rm命令来做这个。 感谢

2 个答案:

答案 0 :(得分:7)

只需在同一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

答案 1 :(得分:1)

在某些情况下,您可以使用以下命令删除名称中包含数字和空格的所有子目录:

$ ls -l tmp
drwxr-xr-x 2 david david 4096 Jun 27 19:28 a1 this.txt
drwxr-xr-x 2 david david 4096 Jun 27 19:28 b2 that.txt
drwxr-xr-x 2 david david 4096 Jun 27 19:28 c3 other.txt
drwxr-xr-x 2 david david 4096 Jun 27 19:30 somefilenotmatched.txt

$ rm -r tmp/*[[:digit:]]*\ *

# ls -l tmp
drwxr-xr-x 2 david david 4096 Jun 27 19:30 somefilenotmatched.txt

您需要事先知道空格和数字的方向。否则,需要两个命令。

并且,如Charles所示,您可以使用[[:digit:]]模式使用[0-9]来避免字符分类。