我想在 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
使用zsh
shell(最近成为 macOS 上的默认 shell):
print -rC1 myfolder/**/*.pdf(.ND)
这将在单列中打印出目录中或目录下名称myfolder
以 结尾的所有常规文件的路径名。.pdf
匹配将包括隐藏的名称。glob 限定符中的 and 对应于在 shell 中设置and shell选项(但仅N
适用于这个单一的通配模式),并且点使模式仅匹配常规文件(即不匹配目录等)D
nullglob
dotglob
bash
答案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 ; )