Ответы:
Просто нашел это:
rsync -a -f"+ */" -f"- *" source/ destination/
http://psung.blogspot.com/2008/05/copying-directory-trees-with-rsync.html
find some/dir -type d -print0 | rsync --files-from=/dev/stdin -0 ...
Другой подход с помощью find и mkdir :
find SOURCE -type d -exec mkdir TARGET/{} \;
Просто убедитесь, что TARGET уже существует, или используйте опцию -p mkdir.
Аналогично, используя (GNU) tar:
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
В действительности вам не нужно указывать в командной строке -print0
find или -0
в командной строке rsync, если только у вас нет имен файлов, содержащих символы новой строки (что возможно, но крайне маловероятно). Tar (и rsync, и cpio) считывают имена файлов построчно; использование терминатора NULL в основном полезно с xargs
, который обычно читает разделенные пробелами имена файлов (и поэтому не обрабатывает файлы / каталоги с пробелами в их именах без -0
).
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
Скопировал бы все файлы с жесткими ссылками. Та же структура, те же разрешения. (примечание: жесткие ссылки, поэтому хранилище не потеряно.)
ls -d * / @source: find. -type d -print0> dirs.txt @destination: xargs -0 mkdir -p
Это заставит обе команды использовать пустые значения в качестве разделителей вместо пробелов. Обратите внимание, что порядок -type d и -print0 важен!
@source
и @destination
являются указаниями для читателя, но даже в этом случае это не может работать.
rsync -a --include='*/' --exclude='*' ${source} ${destination}
.