我有一个目录,我需要删除所有包含空格和目录名中的数字的子目录。我如何模式匹配给定的参数?我需要用一个rm命令来做这个。 感谢
答案 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]
来避免字符分类。