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?

asked Sep 20, 2012 at 12:53
1
  • 1
    How would you like to handle the case there are two files a/x.pdf and b/x.pdf? Commented 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/
answered Sep 20, 2012 at 13:09
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
answered Sep 20, 2012 at 13:08
3
  • Beautiful! +1 ! Commented Sep 20, 2012 at 15:44
  • Don't you need to quote "{}" to deal with file names containing spaces? Commented 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. Commented 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.

answered Sep 20, 2012 at 16:12
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. Commented Sep 20, 2012 at 20:00
  • @RichHomolka see changed answer. (Thanks for the tip. That is really useful!) Commented 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 Commented 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
answered Sep 20, 2012 at 19:00
2
  • 1
    Hi and welcome to SU. Thank you for your answer, but the question specifically requests a linux solution. Commented Sep 21, 2012 at 16:05
  • 2
    It is still marvelous that windows can do that too! Commented 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.

answered Feb 11, 2016 at 22:06

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.