10

Suppose I have this structure for folder0 and subfolders and files in it.

   folder0
      subfolder01
        file011
        file012
      subfolder02
        file021
      file01
      file02

I want to copy all files in main folder folder0 to somewhere else, such that all file be in one directory? How Can I do that? I used

cp --recursive folder0address targetfolderaddress

But subfolders copied to target folder. I just want all files in directory and sub directories not folders. I mean something like the below in target folder:

targetfolder
  file011
  file012
  file021
  file01
  file02

3 Answers 3

16

Use find:

find folder0 -type f -exec cp {} targetfolder \;

With GNU coreutils you can do it more efficiently:

find folder0 -type f -exec cp -t targetfolder {} +

The former version runs cp for each file copied, while the latter runs cp only once.

4
  • 1
    Can you please add explanation of why the GNU variant is more efficient? Commented Mar 15, 2017 at 18:22
  • 2
    @codeforester Running cp once vs. running it for each file. -t is needed because find ... -exec cp {} targetfolder + is invalid syntax ({} must come at the end). Commented Mar 15, 2017 at 18:29
  • Haha! Thanks. You saved me. It works :) ... but what \; do at end of first? Commented Mar 15, 2017 at 19:03
  • 1
    @SirSaleh It marks the end of the -execed command. Commented Mar 16, 2017 at 7:56
5

With zsh, thanks to ** for recursive globbing and the glob qualifier . to match only regular files:

cp -p folder0/**/*(.) targetfolder
1

Or using xargs

 find folder0 -type f | xargs -I {} cp -v {} targetfolder;

Use -v to show what is hapenning.

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.