2012-03-19 35 views

Trả lời

6

Mỗi this question+answer, bạn có thể viết mã này làm đường ống. Các đường ống là một phần không thể thiếu trong lập trình shell và kịch bản lệnh shell.

find /path/to/files -type l -print | \ 
    rsync -av --files-from=- /path/to/files [email protected]:/path 

Điều gì đang xảy ra ở đây?

Lệnh find bắt đầu tại/path/to/files và các bước đệ quy thông qua mọi thứ "trong" điểm đó. Các tùy chọn để find là các điều kiện giới hạn những gì được xuất theo tùy chọn -print. Trong trường hợp này, chỉ những thứ của -type l (liên kết tượng trưng, ​​theo số man find) sẽ được in để tìm ra "tiêu chuẩn đầu ra".

Các tệp này trở thành "đầu vào chuẩn" của tùy chọn --file-from của lệnh rsync.

Tặng thử. Tôi đã không thực sự thử nghiệm này, nhưng có vẻ như với tôi rằng nó sẽ làm việc.

+0

cảm ơn tôi sẽ thử ... – Newbiee

+0

Điều này sẽ không sao chép các liên kết tượng trưng dưới dạng liên kết tượng trưng. – Dan

+0

@Dan ... Vâng, '-a' chuyển thành' -rlptgoD' và '-l' được ghi thành", khi liên kết tượng trưng gặp phải, hãy tạo lại liên kết tượng trưng trên đích. " Bạn đã gặp phải kết quả gì? – ghoti

4

Bạn có thể tạo một danh sách các file trừ mối liên hệ với find input_dir -not -type l, rsync có một tùy chọn --exclude-from=exlude_file.txt

bạn có thể làm điều đó trong hai bước:

find input_dir -not -type l > /tmp/rsync-exclude.txt

rsync -uvrl --exclude-from=/tmp/rsync-exclude.txt input_dir output_dir

một dòng bash :

rsync -urvl --exclude-from=<(find input_dir -not -type l | sed 's/^..//') input_dir output_dir

+0

cảm ơn tôi sẽ thử ... – Newbiee

1

Bạn có thể làm điều đó dễ dàng hơn như:

find /path/to/dir/ -type l -exec rsync -avP {} ssh_server:/path/to/server/ \; 

EDIT: Nếu bạn muốn sao chép liên kết tượng trưng của thư mục hiện chỉ mà không làm cho nó đệ quy. Bạn có thể làm:

find /path/to/dir/ -maxdepth 1 -type l -exec rsync -avP {} ssh_server:/path/to/server/ \; 
Các vấn đề liên quan