Bash 模式匹配与 rm 命令

标签 bash

我有一个目录,我需要删除目录名称中包含空格和数字的所有子目录。我将如何匹配给定参数的模式?我需要用一个 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/

相关文章:

string - 如果字符串包含 case 语句

docker - 如何在 Docker 中为 root 使用 .bashrc

bash - 在 Bash 脚本中随机选择并打印三个字符串之一

python - 如何从 AWS S3 存储桶下载加密的 .gz 文件

linux - 如何使用 bash 将文件中每一行的前 2 个字母添加到列表中?

linux - 通过 bash 和 ssh 逐字传递引号和其他特殊字符

linux - 奇怪的 "sh"行为

regex - 将匹配 YYMMDD 但不匹配更长数字的 bash 正则表达式

Linux 去除串口多余字符

linux - 在设置位置参数时使用 - 和 -- 作为要设置的选项之间的区别