20

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

27

Just found this:

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

http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html

1
  • 4
    I prefer this syntax rsync -a --include='*/' --exclude='*' ${source} ${destination}. Jun 1, 2017 at 20:11
9
find some/dir -type d -print0 | rsync --files-from=/dev/stdin -0 ...
1
  • 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
6

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.

3

You also can do :

find inputdir -type d | cpio -pdumv destdir

The power of simplicity ;)

1
  • 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
1

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).

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

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

2
  • 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
-1

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!

1
  • 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

You must log in to answer this question.

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