Recursive ls with conditions

17

4

Why can't I use a command like this to find all the pdf files in a directory and subdirectories? How do I do it? (I'm using bash in ubuntu)

ls -R *.pdf

EDIT

How would I then go about deleting all these files?

Tomba

Posted 2011-02-15T14:05:39.567

Reputation: 335

Answers

22

Why can't I use a command like this to find all the pdf files in a directory and subdirectories?

The wildcard *.pdf in your command is expanded by bash to all matching files in the current directory, before executing ls.


How do I do it? (I'm using bash in ubuntu)

find is your answer.

find . -name \*.pdf

is recursive listing of pdf files. -iname is case insensitive match, so

find . -iname \*.pdf

lists all .pdf files, including for example foo.PDF

Also, you can use ls for limited number of subfolders, for example

ls *.pdf */*.pdf

to find all pdf files in subfolders (matches to bar/foo.pdf, not to bar/foo/asdf.pdf, and not to foo.PDF).

If you want to remove files found with find, you can use

find . -iname \*.pdf -delete

Olli

Posted 2011-02-15T14:05:39.567

Reputation: 6 704

1Just in case you want an output similar to the ls -l command, showing file size, ownership, date, etc., you can use find with the -ls option, e.g. find . -name \*.pdf -ls – RFVoltolini – 2016-08-01T10:48:12.877

2

As others have said, find is the answer.

Now to answer the other part.

  • How would I then go about deleting all these files?

    find . -iname *.pdf -exec rm {} \;

Should do it.

Matt H

Posted 2011-02-15T14:05:39.567

Reputation: 3 823

2You need to quote your glob to keep it from being prematurely expanded. – Paused until further notice. – 2011-02-15T15:43:58.613

1

Use find instead of ls

find . -name '*.pdf'

vartec

Posted 2011-02-15T14:05:39.567

Reputation: 740