【问题标题】:Globbing with ls to find all files matching a certain pattern使用 ls 查找所有匹配特定模式的文件
【发布时间】:2012-02-29 13:09:54
【问题描述】:

我试图在终端中找到某个文件夹和任何子文件夹中的所有 PDF 文件,而不是在脚本中。我对 linux 也很陌生,所以如果我遗漏了任何明显的东西,或者对诊断我的特定问题至关重要。

我正在使用 bash 4.1.5(1)-release (i486-pc-linux-gnu),并在 google 上对 glob 和 extglob 表达式进行了一些探讨,看来我应该使用的语法是

$ ls **.pdf

然而这什么也没找到,因为在当前文件夹./ 中没有匹配模式*.pdf 的文件;它似乎想将** 读作*

ls: cannot access **.pdf: No such file or directory

在其他地方有 PDF,在 1 到 5 深的子文件夹中(特别是在 every 1 深的子文件夹中),其中一些我可以通过检查来查看

$ ls */*.pdf

因此,ls 似乎工作正常。它的手册似乎不是很有帮助,因为我所看到的可能对我们使用 -R 标志调用 ls 有任何用处,这在上述任何情况下都不能解决问题。

我尝试使用 extglob 模式(确保使用 shopt 打开它们)。我可以用ls */*?(.)pdf 看到我的depth-1 文件,但是用ls .*(/*)pdfls .*(/*).pdf 看不到任何东西,即使在有PDF 的子目录中也是如此。

我在别处读到(参考 git 存储库中的 .gitignore 文件)** 模式不适用于所有人。

这会影响我吗?我该如何补救(最好没有超级用户权限)?这个(或一些相关问题)是否也会影响 extglob 功能?

【问题讨论】:

    标签: glob ls


    【解决方案1】:

    选项extglobglobstar 是从glob 库中获取扩展功能所必需的;它们是使用 shell 选项 (shopt) 实用程序打开的,如下所述。

    要使用globstar(这会导致** 模式的行为如 bash 手册中所述),必须使用

    激活它(在 bash 4.0+ 中)
    shopt -s globstar
    

    要启用更多“功能性”正则表达式类型的表达式,例如 ?(ab)*(ab),请使用

    shopt -s extglob
    

    要再次关闭这些选项,请指定 -u 标志而不是 s,例如

    shopt -u globstar
    

    【讨论】:

      【解决方案2】:

      你可以考虑查找

      find . -name '*.pdf' -exec ls -l {} \;
      

      find . -name '*.pdf' -ls
      

      在哪里。是您当前的工作目录。 glob 功能随 4.0+ bash 一起提供。换句话说,glob 扩展是不可移植的。

      【讨论】:

      • “glob 扩展”是指extglob shell 选项吗?被find授予荣誉了吗?
      猜你喜欢
      • 1970-01-01
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多