Я хочу скопировать около 200 каталогов и подкаталогов из одного места в другое, но я не хочу копировать тысячи файлов в этих каталогах. Я на Linux.
Примечание: у меня недостаточно места, чтобы скопировать все, а затем удалить все файлы.
Только что нашел это:
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 ...
Другой подход - с найти и mkdir:
find SOURCE -type d -exec mkdir TARGET/{} \;
Просто убедитесь, что TARGET уже существует, или используйте параметр -p в mkdir.
Вы также можете:
find inputdir -type d | cpio -pdumv destdir
Сила простоты;)
Аналогично, используя (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: найти. -type d -print0> dirs.txt @destination: xargs -0 mkdir -p
Это заставит обе команды использовать нули в качестве разделителей вместо пробелов. Обратите внимание, что порядок -type d и -print0 важен!