我想列出目录中以“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 -n1
或for
循环:
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)
(其实我们xargs
和for
上面的做法是错误的,因为如果有一个名为abc*.zip
例如,unzip
将其当作一种模式!看到bsdtar
一个更unixy方法来提取zip
档案)
对于不区分大小写的匹配,您可以[aA][bB][cC]*.[zZ][iI][pP]
便携地使用。一些 shell 为不区分大小写的匹配扩展了通配符:
zsh
:
setopt extendedglob
ls -ld (#i)abc*.zip
Run Code Online (Sandbox Code Playgroud)
或者:
ls -ld ((#i)abc)*.zip
Run Code Online (Sandbox Code Playgroud)
如果您只希望该abc
部分不区分大小写。
ksh93
:
ls -ld ~(i)abc*.zip
Run Code Online (Sandbox Code Playgroud)
或者:
ls -ld ~(i:abc)*.zip
Run Code Online (Sandbox Code Playgroud)与bash
.
shopt -s nocaseglob
ls -ld abc*.zip
Run Code Online (Sandbox Code Playgroud)
(除了使用可移植语法之外,没有办法只让部分 globs 区分大小写)。
与yash
:
set +o case-glob
ls -ld abc*.zip
Run Code Online (Sandbox Code Playgroud)
与bash
上述相同的评论。
小智 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
不区分大小写的搜索。