I want to copy about 200 directories & subdirectories from one location to another but I don't want to copy the thousands of files within those directories. I am on Linux.

Note: I don't have enough space to copy everything then delete all the files.

8 Answers 8


Just found this:

rsync -a -f"+ */" -f"- *" source/ destination/


  • 4
    I prefer this syntax rsync -a --include='*/' --exclude='*' ${source} ${destination}. Jun 1, 2017 at 20:11
find some/dir -type d -print0 | rsync --files-from=/dev/stdin -0 ...
  • It would be useful to add what is -0 and what is the ellipsis. The former, I guess, is for rsync to read the output of find's print0. Nov 4, 2020 at 18:11

Another approach is with find and mkdir:

find SOURCE -type d -exec mkdir TARGET/{} \;

Just make sure TARGET already exists or use the -p option of mkdir.


You also can do :

find inputdir -type d | cpio -pdumv destdir

The power of simplicity ;)

  • In the beginning of man cpio it says: "__WARNING__ The cpio utility is considered LEGACY based on POSIX specification. Users are encouraged to use other archiving tools for archive creation." Nov 4, 2020 at 18:08

Similarly, using (GNU) tar:

find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)

You don't really need the -print0 on the find command line or the -0 on the rsync command line unless you have filenames that contain newline characters (which is possible but highly unlikely). Tar (and rsync, and cpio) read filenames line-by-line; using a NULL terminator is mostly useful with xargs, which normally reads whitespace separated filenames (and so does not handle files/directories with spaces in their names without -0).

(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al 

Would copy all files with hard links. Same structure, same permissions. (note: hard links, so no storage lost.)

  • It is not possible to create hard links across filesystem boundaries
    – MountainX
    Jun 9, 2016 at 1:32
  • True, but it wasn't said that it was across filesystem ...
    – SvennD
    Jun 9, 2016 at 11:48

ls -d */ @source: find . -type d -print0 >dirs.txt @destination: xargs -0 mkdir -p

This will cause both commands to use nulls as separators instead of whitespaces. Note that the order of -type d and -print0 is important!

  • This is not clear and seems incorrect. It seems that the @source and @destination are indications to the reader, but even so this cannot work.
    – Law29
    Oct 2, 2018 at 5:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.