23

I have a directory containing a large number of PDF files, some of which are in subdirectories (which can extend several layers deep). I would like to move all files matching *.pdf into a single output folder named papers.

How can I do this?

1
  • 1
    How would you like to handle the case there are two files a/x.pdf and b/x.pdf? Sep 20, 2012 at 19:00

5 Answers 5

23

If you use bash in a recent version, you can profit from the globstar option:

shopt -s globstar
mv **/*.pdf papers/
1
31
  find /bunchopdfs -name "*.pdf" -exec mv {} /papers \;    

Here's a test I did

$ ls -R
.:
a  aaa bbb.pdf  pdfs

./a:
foo.pdf

./pdfs:

Notice the file "aaa bbb.pdf".

$ find . -name "*pdf" -exec mv {} pdfs \;
$ ls -R
.:
a  pdfs

./a:

./pdfs:
aaa bbb.pdf  foo.pdf
3
  • Beautiful! +1 ! Sep 20, 2012 at 15:44
  • Don't you need to quote "{}" to deal with file names containing spaces?
    – terdon
    Sep 21, 2012 at 16:10
  • @terdon: Actually, no you don't (though that sort of problem does catch me out sometimes). See updated answer. Sep 21, 2012 at 16:22
4
find -print0 /directory/with/pdfs -iname "*.pdf" | xargs -0 mv -t /papers

(similar to another answer but I prefer pipe/xargs/mv ... more intuitive for me)

FYI, I did the above one-line script successfully on multiple directories and multiple pdf files.

3
  • 1
    xargs has the issue of "spaces in filenames" that -exec doesn't. You can mediate this somewhat by adding args -print0 to your find, and -0 to xargs. Sep 20, 2012 at 20:00
  • @RichHomolka see changed answer. (Thanks for the tip. That is really useful!) Sep 24, 2012 at 10:32
  • Have you ever tried that? Looks like you need to add the "-print0" at the end of the find command
    – tollo
    May 16, 2018 at 16:41
0

For the Windows command line (cmd.exe), you can use:

for /F "usebackq delims==" %j IN (`dir /s /b *.pdf`) do copy "%j" c:\target_dir
2
  • 1
    Hi and welcome to SU. Thank you for your answer, but the question specifically requests a linux solution.
    – terdon
    Sep 21, 2012 at 16:05
  • 2
    It is still marvelous that windows can do that too!
    – Vorac
    Sep 26, 2012 at 10:01
0

If you're only searching one directory deep, you could do:

mkdir <destination>
mv */*.pdf <destination>

where <destination> stands for some directory. mv will not automatically create a directory for you.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .