列出带有开始和结束模式的文件

uni*_*ude 14 ls

我想列出目录中以“abc”开头并以“.zip”结尾的所有文件

我正在尝试使用ls.

该目录有很多以abc<date>和开头的 zip 文件xvz<date>。我只想得到abc<date>.zip

Sté*_*las 18

ls不对文件名进行模式匹配。它只列出目录的内容和作为参数给出的文件。

另一方面,您的 shell 具有称为globbing文件名生成的功能,可将模式扩展为与该模式匹配的文件列表。

这里的 glob 模式将是abc*.zip*作为代表任意数量字符的通配符)。

您可以将它传递给您喜欢的任何命令,例如printf用于打印:

printf '%s\n' abc*.zip
Run Code Online (Sandbox Code Playgroud)

您还可以将其传递给以ls -l显示这些文件的属性:

ls -ld abc*.zip
Run Code Online (Sandbox Code Playgroud)

(我们需要,-d因为如果这些文件中的任何一个是directory类型,ls否则将列出它们的内容)。

或者,unzip如果一次unzip只能提取多个文件,就可以提取它们。不幸的是它没有,所以你需要使用xargs -n1for循环:

printf '%s\0' abc*.zip | xargs -r0n1 unzip
Run Code Online (Sandbox Code Playgroud)

或者:

for file in abc*.zip; do unzip "$file"; done
Run Code Online (Sandbox Code Playgroud)

但实际上,unzip它更像是 MS-DOS 命令的一个端口,unzip它本身会将其参数视为一个 glob。换句话说,unzip 'abc*.zip'不会解压缩被调用的文件abc*.zip(在 Unix 上是完全有效的文件名,而不是在 Microsoft 操作系统上),而是解压缩与abc*.zip模式匹配的文件,所以你实际上想要:

 unzip 'abc*.zip'
Run Code Online (Sandbox Code Playgroud)

(其实我们xargsfor上面的做法是错误的,因为如果有一个名为abc*.zip例如,unzip将其当作一种模式!看到bsdtar一个更unixy方法来提取zip档案)


对于不区分大小写的匹配,您可以[aA][bB][cC]*.[zZ][iI][pP]便携地使用。一些 shell 为不区分大小写的匹配扩展了通配符:


小智 12

ls abc*.zip
Run Code Online (Sandbox Code Playgroud)

但是,如果文件太多,这将失败(就可以扩展到多少个参数而言,shell 扩展是有限制的)。

find . -name "abc*.zip"
Run Code Online (Sandbox Code Playgroud)

这可能是最普遍的。引号必须在那里。对于某些find实现,您还可以使用-iname代替-name不区分大小写的搜索(aBc<date>.ZIP也会匹配)。

ls | grep -x "abc.*\.zip"
Run Code Online (Sandbox Code Playgroud)

请注意.*\.因为过滤器 grep 使用的是正则表达式,这与 shell 用于扩展的通配符表示法不同。使用grep -i不区分大小写的搜索。