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

Ty *_*oum 4 command-line bash wildcards

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

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
Run Code Online (Sandbox Code Playgroud)

如果我只想列出包含 abc 并以 .out 结尾的文件,我该怎么做。我想执行lsfind使用两种模式匹配搜索*abc**out。我一次只知道如何搜索一个或另一个,我如何让它搜索具有这两个条件的文件名?

小智 5

这会给你你想要的:

$ find . -name '*abc*' -o -name '*out'
Run Code Online (Sandbox Code Playgroud)

  • 首先感谢您的回复。您给出的命令似乎列出了文件名中包含“abc”或以“.out”结尾的所有文件。我想要一个命令来列出所有包含“abc”并以“.out”结尾的文件 (2认同)

Kus*_*nda 4

我将问题中使用的“和”解释为严格的“逻辑与”,即“查找名称与 *abc*都匹配的文件*out”。

您可以在一个文件名通配模式中使用多个通配符:

$ ls *abc*out
Run Code Online (Sandbox Code Playgroud)

或者

$ find . -type f -name "*abc*out"
Run Code Online (Sandbox Code Playgroud)

例如。

该模式*abc*out将匹配包含该字符串abc并以 结尾的任何名称out

如果没有文件与该模式匹配,则该模式将保持未展开状态。如果发生这种情况,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
Run Code Online (Sandbox Code Playgroud)