![在一个 glob 中使用多个通配符](https://linux22.com/image/109594/%E5%9C%A8%E4%B8%80%E4%B8%AA%20glob%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AA%E9%80%9A%E9%85%8D%E7%AC%A6.png)
在我的目录中,我有一个具有不同扩展名的文件列表,例如
file-abc-12.out
file-abc-12.csv
file-abc-12.txt
file-xyz-12.out
file-xyz-12.csv
file-xyz-12.txt
file-abc-04.out
file-abc-04.csv
file-abc-04.txt
file-xyz-04.out
file-xyz-04.csv
file-xyz-04.txt
如果我只想列出包含 abc 并以 .out 结尾的文件,我该怎么做。我想使用两个模式匹配搜索和 来执行 als
或 a 。我只知道如何一次搜索其中一个,我如何让它搜索具有这两种条件的文件名?find
*abc*
*out
答案1
这会给你你想要的:
$ find . -name '*abc*' -o -name '*out'
答案2
我将问题中使用的“和”解释为严格的“逻辑与”,即“查找名称匹配的文件”两个都 *abc*
和*out
”。
您可以在一个文件名通配模式中使用多个通配符:
$ ls *abc*out
或者
$ find . -type f -name "*abc*out"
例如。
该模式将匹配包含该字符串并以 结尾的*abc*out
任何名称。abc
out
如果没有文件与该模式匹配,则该模式将保持未展开状态。如果发生这种情况,ls
将获取模式*abc*out
作为参数而不是有效的文件名,并会抱怨ls: cannot access *abc*out: No such file or directory
.
要bash
显示有关无法扩展文件通配模式的错误,而不是将未扩展的模式传递给ls
,请设置failglob
shell 选项:
bash-4.4$ ls *abc*out
ls: *abc*out: No such file or directory
bash-4.4$ shopt -s failglob
bash-4.4$ ls *abc*out
bash: no match: *abc*out
答案3
我发现对我有用的解决方案涉及使用 grep。它跟随:
$ ls *out | grep "abc"