我想列出目录中以“abc”开头并以“.zip”结尾的所有文件
我正在尝试使用ls
.
该目录有很多以abc<date>
和开头的 zip 文件xvz<date>
。我只想获取以下列表abc<date>.zip
答案1
ls
不对文件名进行模式匹配。它只是列出了作为参数给出的目录和文件的内容。
另一方面,您的 shell 有一个称为通配或者文件名生成或者路径名扩展将模式扩展为与该模式匹配的文件列表。
这里的 glob 模式将是abc*.zip
(*
作为通配符,代表任意数量的字符)。
您可以将其传递给您喜欢的任何命令,例如printf
打印:
printf '%s\n' abc*.zip
您还可以将其传递给以ls -l
显示这些文件的属性:
ls -ld abc*.zip
(我们需要-d
,因为如果这些文件中的任何一个是类型目录,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
是错误的,因为如果有一个文件被调用,abc*.zip
例如,unzip
会将其视为一种模式!请参阅 获取bsdtar
更unixy的方式来提取zip
档案)
对于不区分大小写的匹配,您可以使用[aA][bB][cC]*.[zZ][iI][pP]
² 可移植。一些 shell 具有扩展的通配符,用于不区分大小写的匹配:
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
上面相同的评论。
¹ 除非您想考虑-I PATTERN
// --ignore=PATTERN
GNU--hide=PATTERN
实现的非标准扩展ls
。
² 但请注意,在包括 在内的多个 shell 中bash
,如果模式与任何文件都不匹配,则会按原样传递给命令,然后最终会提取一个名为[aA][bB][cC]*.[zZ][iI][pP]
字面意思的文件。在 bash 中设置该failglob
选项可以避免该问题。
答案2
ls abc*.zip
然而,如果文件太多,这将会失败(shell 扩展在可以扩展的参数数量方面存在限制)。
find . -name "abc*.zip"
这可能是最普遍的。引号必须在那里。对于某些find
实现,您还可以使用-iname
而不是-name
不区分大小写的搜索(aBc<date>.ZIP
也将匹配)。
ls | grep -x "abc.*\.zip"
请注意.*
and\.
因为过滤器 grep 使用的是正则表达式,它与 shell 用于扩展的通配符表示法不同。用于grep -i
不区分大小写的搜索。
答案3
ls
您可以将to的输出通过管道传输grep
。
假设我想查找abc
文件名中包含的所有文件
ls -f | grep abc
如果您需要特定的图案变化,man grep
答案4
ls
您必须指定示例中要搜索的目录
ls -la ~/file*.*
ls -la ./file*.*
它对我有用,但显然它不支持按模式搜索