使用ls查找匹配特定模式的所有文件

Nic*_*lin 11 ls glob

我试图在一些文件夹和任何子文件夹中找到所有PDF文件,只是在终端中,而不是在脚本中.我对linux也很陌生,所以如果我错过任何明显的事情,或者对诊断我的特定问题至关重要,请道歉.

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

$ ls **.pdf
Run Code Online (Sandbox Code Playgroud)

然而,这没有任何结果,因为没有文件匹配*.pdf当前文件夹中的模式./; 它似乎想读***:

ls: cannot access **.pdf: No such file or directory
Run Code Online (Sandbox Code Playgroud)

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

$ ls */*.pdf
Run Code Online (Sandbox Code Playgroud)

因此,ls似乎工作正常.它的手册似乎不是很有帮助,因为我所能看到的可能是任何使用我们ls-R旗帜调用的东西,这在上述任何一种情况下都没有解决问题.

我尝试使用extglob模式(确保打开它们shopt).我可以看到我的深度-1文件有ls */*?(.)pdf,但我看不到任何与ls .*(/*)pdfls .*(/*).pdf,甚至那里有一个PDF文件子目录中.

我在其他地方(参考.gitignoregit存储库中的文件)中读到该**模式并不适用于所有人.

这可能会影响我,我如何解决它(理想情况下没有超级用户权限)?可能这个(或一些相关问题)也会影响extglob功能吗?

jim*_*ara 14

你可能想考虑一下

find . -name '*.pdf' -exec ls -l {} \;
Run Code Online (Sandbox Code Playgroud)

要么

find . -name '*.pdf' -ls
Run Code Online (Sandbox Code Playgroud)

哪里.是您当前的工作目录.glob功能附带4.0+ bash.换句话说,glob扩展不可移植.


Nic*_*lin 5

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

要使用globstar(导致**模式按照bash手册中的描述运行),必须激活它(在bash 4.0+中)

shopt -s globstar
Run Code Online (Sandbox Code Playgroud)

并启用更多"功能"正则表达式表达式?(ab)*(ab)它们的完整效果,使用

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

要再次关闭选项,请为eaxample 指定-u标志而不是s

shopt -u globstar
Run Code Online (Sandbox Code Playgroud)