List files recursively on OSX

lsosx

I want to find all PDF files in a directory and its subdirectories, on OSX.

I know there are some PDFs in subdirectories, because e.g. this produces lots of results:

ls myfolder/pdfs/*.pdf

All my Googling suggests I want ls -R, but this produces no results:

ls -R *.pdf

What am I doing wrong?

I can find some results this way:

ls -R | grep pdf

But I can't see this full paths to the files, which isn't very helpful.

Best Answer

ls -R *.pdf would invoke ls recursively on anything matching *.pdf (if there's nothing matching *.pdf in the current directory, you'll get no result, and if there is, it will only recurse into it if it's a directory). ls -R | grep pdf would show you everything in the ls -R result that matches the regular expression pdf, which is not what you want.

This is what you need:

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

This will give you the pathnames of all regular files (-type f) in or below the myfolder directory whose filenames matches the pattern *.pdf. The pattern needs to be quoted to protect it from the shell.

With the zsh shell (which recently became the default shell on macOS):

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

This would print out the pathnames of all regular files in or below the directory myfolder that have names ending in .pdf, in a single column. The matching would include hidden names. The N and D in the glob qualifier corresponds to setting the nullglob and dotglob shell options in the bash shell (but only for this single globbing pattern), and the dot makes the pattern only match regular files (i.e. not directories etc.)

Related Question