Nếu bạn đang mở để sử dụng shell Unix, đây là một vài lựa chọn thay thế sử dụng bash
hoặc shell C của riêng tôi.
Dung dịch vỏ C
Đây là cách bạn có thể làm với shell Hamilton C , bao gồm cả phiên bản miễn phí :
cd F2
foreach i (...\*)
if ( -f $i ) then
if ( -e F1\$i ) cp F1\$i Fbackup\$i
cp $i F1\$i
end
end
Các ...
ký hiệu là một ký tự đại diện thư mục không xác định phù hợp không hay nhiều mức độ thư mục, bất cứ điều gì cần thiết để làm cho phần còn lại của trận đấu mẫu. ...\*
phù hợp với mọi tập tin hoặc thư mục trong F2
cây thư mục. Các -e
nhà điều hành kiểm tra cho sự tồn tại và -f
kiểm tra điều hành cho các tập tin.
Đoạn mã này giả định không có tập tin hoặc thư mục ẩn nào đáng quan tâm. Nó cũng giả định rằng mọi thư mục trong F2
(ngay cả khi không phải mọi tệp) đã tồn tại trong F1
và Fbackup
.
Nếu các tệp ẩn và thư mục bị thiếu cần được xem xét, giải pháp sẽ là đặt
nonohidden = 1
và mkdir
mọi thư mục bị thiếu:
cd F2
@ nonohidden = 1
foreach i (...\*)
if ( -f $i ) then
if ( -e F1\$i ) then
if ( ! -e Fbackup\$i:h ) mkdir -r Fbackup\$i:h
cp F1\$i Fbackup\$i
end
if ( ! -e F1\$i:h ) mkdir -r F1\$i:h
cp $i F1\$i
end
end
bash
dung dịch
Nếu bạn thích Cygwin bash
, bạn sẽ cần sử dụng find
thay cho ...
ký tự đại diện để treewalk F2
thư mục. Đây là giải pháp có thể trông như thế nào. (Tôi không phải là bash
chuyên gia nên có thể cải thiện điều này.)
Đầu tiên, tạo một kịch bản, gọi nó backupscript.sh
:
#!/usr/bin/bash
if [ -f "$@" ]; then
if [ -e F1/"$@" ]; then
cp F1/"$@" Fbackup/"$@"
fi
head=$(dirname "$@")
if [ ! -e F1/"$head" ]; then
mkdir -p F1/"$head"
fi
cp "$@" F1/"$@"
end
Sau đó chạy như sau:
cd F2
find . -type f | xargs -I "{}" bash -c "backupscript.sh {}"
.cmd
? Với shell Unix, tôi có thể thực hiện trong 5 dòng nhưng tôi không chắc là có thể chấp nhận được.