Відповіді:
Щойно знайшли це:
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) дьоготь:
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
Насправді вам не потрібен -print0
командний рядок find або командний рядок -0
rsync, якщо у вас є назви файлів, які містять символи нового рядка (що можливо, але малоймовірно). Тар (і rsync, і cpio) читають назви файлів по черзі; використання термінатора NULL здебільшого корисне для xargs
, який зазвичай читає розділені назви файлів пробілів (і тому не обробляє файли / каталоги з пробілами без їх назв -0
).
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
Скопіював би всі файли із жорсткими посиланнями Та сама структура, однакові дозволи. (зверніть увагу: жорсткі посилання, тому зберігання не втрачено.)
ls -d * / @source: знайти. -тип d -print0> dirs.txt @destination: xargs -0 mkdir -p
Це призведе до того, що обидві команди використовуватимуть нулі як роздільники замість пробілів. Зауважте, що порядок -типу d і -print0 важливий!
@source
і @destination
є ознакою для читача, але навіть так це не може працювати.
rsync -a --include='*/' --exclude='*' ${source} ${destination}
.