Odpowiedzi:
Właśnie to znalazłem:
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 ...
Innym podejściem jest find i mkdir :
find SOURCE -type d -exec mkdir TARGET/{} \;
Upewnij się tylko, że TARGET już istnieje lub użyj opcji -p programu mkdir.
Podobnie, używając tar (GNU):
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
Tak naprawdę nie potrzebujesz -print0
wiersza polecenia find ani wiersza polecenia -0
rsync, chyba że masz nazwy plików zawierające znaki nowego wiersza (co jest możliwe, ale bardzo mało prawdopodobne). Tar (i rsync i cpio) czytają nazwy plików linia po linii; użycie terminatora NULL jest najbardziej przydatne w przypadku xargs
, który normalnie odczytuje nazwy plików oddzielone spacjami (a więc nie obsługuje plików / katalogów bez spacji w nazwach -0
).
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
Kopiuje wszystkie pliki z twardymi linkami. Ta sama struktura, te same uprawnienia. (uwaga: twarde linki, więc nie stracono miejsca).
ls -d * / @source: find. -type d -print0> dirs.txt @destination: xargs -0 mkdir -p
Spowoduje to, że oba polecenia będą używać wartości null jako separatorów zamiast białych znaków. Zauważ, że kolejność -type i -print0 jest ważna!
@source
i @destination
są wskazówkami dla czytelnika, ale i tak to nie działa.
rsync -a --include='*/' --exclude='*' ${source} ${destination}
.