【问题标题】:What's the wildcard for dot in bash?bash中点的通配符是什么?
【发布时间】:2018-10-31 08:48:49
【问题描述】:

我有 0001.file1.email.data.spam.txt 和 0001.file1.email.data.spam_1.txt 之类的文件

现在我想删除所有以“_1.txt”结尾的文件,我尝试使用“rm -rf *spam_1.txt”,但找不到文件。可能是因为 * 不能被视为点。

【问题讨论】:

  • *spam_1.txt 应该按预期工作。您看到了什么错误?
  • 在子目录中删除可能:find . -name '*spam_1.txt' -delete
  • *spam_1.txt,显示没有这样的文件或目录
  • 找到 . -name '*spam_1.txt' - 删除。这个有效,已验证。我不知道为什么 rm *spam_1.txt 不起作用。

标签: bash wildcard


【解决方案1】:

点是一个简单匹配自身的文字字符。

* 通配符匹配任何字符序列,? 通配符匹配任何单个字符,但通配符匹配将忽略以点开始的文件,除非您启用了dotglob (默认关闭)。

您可以使用通配符表达式轻松检查哪些文件正在匹配

printf '>>%s<<\n' *spam_1.txt

&gt;&gt;...&lt;&lt; 装饰只是为了方便查看任何前导或尾随空格,并非绝对必要。)

在没有nullglob 的情况下,如果找不到任何匹配项,上面将打印通配符本身。另请查看failglob,如果通配符不匹配任何内容,则会导致打印错误并中止命令。

【讨论】:

  • 这是检查匹配内容的有用方法。虽然我发现它在没有匹配项时会产生误报,例如 printf '&gt;&gt;%s&lt;&lt;\n' *absent_1.txt 打印 &gt;&gt;*absent_1.txt&lt;&lt; - (即不存在名为 absent_1.txt 的文件,但这表明并非如此)。
  • 使用 nullglobfailglob 来控制 glob 的行为(如果它们不匹配任何内容)。
猜你喜欢
  • 2011-11-13
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
相关资源
最近更新 更多