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?
    – SirSaleh
    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.

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