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

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

我想列出目录中以“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 -n1for循环:

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=PATTERNGNU--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*.*

它对我有用,但显然它不支持按模式搜索

相关内容