Câu trả lời:
Chỉ cần tìm thấy điều này:
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 ...
Một cách tiếp cận khác là tìm và mkdir :
find SOURCE -type d -exec mkdir TARGET/{} \;
Chỉ cần đảm bảo TARGET đã tồn tại hoặc sử dụng tùy chọn -p của mkdir.
Tương tự, sử dụng tar (GNU):
find some/dir -type d -print |
tar --no-recursion -T- -c -p -f- |
(cd another/dir && tar -x -p -f-)
Bạn không thực sự cần -print0
dòng lệnh find hoặc dòng lệnh -0
rsync trừ khi bạn có tên tệp chứa các ký tự dòng mới (có thể nhưng rất khó xảy ra). Tar (và rsync, và cpio) đọc tên tệp theo từng dòng; sử dụng một bộ kết thúc NULL hầu như rất hữu ích với xargs
, thông thường đọc tên tệp được phân tách bằng khoảng trắng (và do đó không xử lý các tệp / thư mục có khoảng trắng trong tên của chúng mà không có -0
).
(cd /home/user/source/; find -type d -print0) | xargs -0 mkdir -p
cp -al
Sẽ sao chép tất cả các tập tin với các liên kết cứng. Cùng cấu trúc, cùng quyền. (lưu ý: liên kết cứng, do đó không mất dung lượng.)
ls -d * / @source: tìm. -type d -print0> dirs.txt @destination: xargs -0 mkdir -p
Điều này sẽ khiến cả hai lệnh sử dụng null làm dấu phân cách thay vì khoảng trắng. Lưu ý rằng thứ tự của -type d và -print0 rất quan trọng!
@source
và @destination
là chỉ dẫn cho người đọc, nhưng ngay cả như vậy điều này không thể làm việc.
rsync -a --include='*/' --exclude='*' ${source} ${destination}
.