在 OSX 上递归列出文件?

在 OSX 上递归列出文件?

我想在 OSX 上查找目录及其子目录中的所有 PDF 文件。

我知道子目录中有一些 PDF,因为例如这会产生很多结果:

ls myfolder/pdfs/*.pdf

我所有的谷歌搜索都表明我想要ls -R,但这不会产生任何结果:

ls -R *.pdf

我究竟做错了什么?

我可以这样找到一些结果:

ls -R | grep pdf

但我看不到文件的完整路径,这不是很有帮助。

答案1

ls -R *.pdf会递归ls地调用任何匹配的内容*.pdf(如果当前目录中没有任何匹配的内容*.pdf,则不会得到任何结果,如果有,则仅在目录是目录时才会递归到该结果)。 ls -R | grep pdf会显示ls -R结果中与正则表达式匹配的所有内容pdf,这不是您想要的。

这就是您所需要的:

find myfolder -type f -name '*.pdf'

这将为您提供文件名与模式匹配的目录-type f中或目录下的所有常规文件 () 的路径名。需要引用该模式以保护它免受 shell 的影响。myfolder*.pdf

使用zshshell(最近成为 macOS 上的默认 shell):

print -rC1 myfolder/**/*.pdf(.ND)

这将在单列中打印出目录中或目录下名称myfolder以 结尾的所有常规文件的路径名。.pdf匹配将包括隐藏的名称。glob 限定符中的 and 对应于在 shell 中设置and shell选项(但仅N适用于这个单一的通配模式),并且点使模式仅匹配常规文件(即不匹配目录等)Dnullglobdotglobbash

答案2

尝试

find . -name \*.pdf -print

这应该列出 pdf 之类的

myfolder/foo/doc1.pdf
myfolder/bar/foo/doc2.pdf

请注意,如果起始目录中有 pdf,则必须对*in进行转义。*.pdf

答案3

bash在终端(至少版本 4)上的本机 shell 上macOS,启用扩展 glob 选项globstar以在嵌套子目录上启用递归 glob 匹配。

shopt -s globstar nullglob
printf '%s\n' **/*.pdf

防止nullglob与任何文件不匹配的文件名模式扩展为空字符串,而不是其本身。使用 时globstar,文件名扩展上下文中使用的模式**将匹配所有文件以及零个或多个目录和子目录。

为了安全起见,避免在当前 shell 上设置 shell 选项,您可以在子 shell 中设置它

( shopt -s globstar nullglob; printf '%s\n' **/*.pdf ; )

相关内容