Answers:
ls
不对文件名进行模式匹配。它仅列出目录的内容以及作为参数给出的文件。
另一方面,您的外壳程序具有称为globlob或文件名生成的功能,该功能可将模式扩展为与该模式匹配的文件列表。
这里的glob模式将是abc*.zip
(*
是代表任意数量字符的通配符)。
您可以将其传递给您喜欢的任何命令,例如printf
用于打印的命令:
printf '%s\n' abc*.zip
您还可以传递它以ls -l
显示那些文件的属性:
ls -ld abc*.zip
(我们需要,-d
因为如果其中任何文件的类型为directory,ls
则将列出其内容)。
或要unzip
提取它们(如果一次unzip
只能提取多个文件)。不幸的是,事实并非如此,因此您需要使用xargs -n1
或for
循环:
printf '%s\0' abc*.zip | xargs -r0n1 unzip
要么:
for file in abc*.zip; do unzip "$file"; done
但是实际上,unzip
它更像是MS-DOS命令的端口,unzip
本身会将其参数视为glob。换句话说,unzip 'abc*.zip'
不会解压缩名为abc*.zip
(在Unix上是完全有效的文件名,而不是在Microsoft操作系统上的完全有效文件名)的文件,而是解压缩与abc*.zip
模式匹配的文件,因此您实际上需要:
unzip 'abc*.zip'
(实际上xargs
,for
上面的and 方法将是错误的,因为如果有一个名为的文件abc*.zip
,unzip
则将其视为一种模式!请参阅bsdtar
以更统一的方式提取zip
档案)
对于不区分大小写的匹配,您可以方便地使用[aA][bB][cC]*.[zZ][iI][pP]
。一些外壳程序具有扩展的全局操作符,用于不区分大小写的匹配:
zsh
:
setopt extendedglob
ls -ld (#i)abc*.zip
要么:
ls -ld ((#i)abc)*.zip
如果您只希望abc
零件不区分大小写。
ksh93
:
ls -ld ~(i)abc*.zip
要么:
ls -ld ~(i:abc)*.zip
与bash
。
shopt -s nocaseglob
ls -ld abc*.zip
(除了使用可移植语法之外,没有办法只让部分glob区分大小写)。
与yash
:
set +o case-glob
ls -ld abc*.zip
与bash
上述相同。
ls abc*.zip
但是,如果文件太多,此操作将失败(shell扩展在可以扩展到多少个参数方面受到限制)。
find . -name "abc*.zip"
这可能是最通用的。引号必须在那里。在某些find
实现中,您还可以使用-iname
而不是-name
不区分大小写的搜索(aBc<date>.ZIP
也可以匹配)。
ls | grep -x "abc.*\.zip"
注意.*
和,\.
因为过滤器grep使用的是正则表达式,它与shell用于扩展的通配符表示法不同。使用grep -i
不区分大小写的搜索。
execve()
系统调用中的内核限制。
find
也会在子目录中查找这些文件。如果您的支持类似于GNU或BSD,或者如果您的支持类似于某些BSD,请使用find . ! -name . -prune -name 'abc*.zip' -print
或以将其限制为当前目录。find . -maxdepth 1 -name 'abc*.zip'
find
-maxdepth
find . -depth 1 -name 'abc*.zip'
find
-depth <n>
$ ls ../*.a
为我工作(在父目录中列出档案)。
ls -1 | grep "abc$(your_date).zip"
?