在一个 glob 中使用多个通配符

在一个 glob 中使用多个通配符

在我的目录中,我有一个具有不同扩展名的文件列表,例如

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任何名称。abcout

如果没有文件与该模式匹配,则该模式将保持未展开状态。如果发生这种情况,ls将获取模式*abc*out作为参数而不是有效的文件名,并会抱怨ls: cannot access *abc*out: No such file or directory.

bash显示有关无法扩展文件通配模式的错误,而不是将未扩展的模式传递给ls,请设置failglobshell 选项:

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"

相关内容