Tôi đã sử dụng thiết bị đầu cuối để sao chép các tập tin từ ổ đĩa này sang ổ đĩa khác.
sudo mv -vi /location/to/drive1/ /location/to/drive2/
Tuy nhiên, điều đó đột nhiên dừng lại, trong khi một vài giờ vào nó, và không có lỗi, sau khi tạo một thư mục.
Giải pháp của riêng tôi thường là kết hợp băm và so sánh phần lớn là một mớ hỗn độn tốn thời gian vì bây giờ tôi phải khôi phục từ một bản sao trung gian mà không thực sự biết tệp nào bị thiếu (được viết dưới dạng một lớp rất dài cho zsh - lưu ý rằng kịch bản này không hoạt động trong bash như được viết):
source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
echo "${hash_and_file}" | read hash file;
echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
mv -v "${copy_from}" "${copy_to}" | tee -a log;
rm -v "${copy_from}" | tee -a log; };
done <<<$(
comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${source_directory}: :g" | sort;
) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
sed "s: ${target_directory}: :g" | sort; ) )
Đây là lỗi dễ xảy ra nếu thư mục đích tên hoặc source_directory là một phần của đường dẫn và xóa các tệp nếu chúng chưa được di chuyển vì chúng được đánh dấu là trùng lặp. Ngoài ra, nó không có thư mục nguồn cuối cùng.
Có một thực hành tốt nhất làm thế nào để phục hồi từ mv bị gián đoạn?
--delete-during receiver deletes during the transfer
và một số lựa chọn thay thế hữu ích khác : --delete --delete-before --delete-delay --delete-after --delete-excluded
. Vì vậy, vâng, rsync là sự thay thế tốt nhất,
mv
lệnh? Có lẽ với *
đường dẫn nguồn được thêm vào nếu nguồn ban đầu là một thư mục.
rsync --delete*
sẽ là một thảm họa ! Nó sẽ xóa những thứ dest
không có trong đó src
, vì vậy tất cả các tệp đã được di chuyển thành công trong lần thử trước sẽ bị xóa! Bạn có thể nghĩ rằng rsync --remove-source-files
tôi đồng ý sẽ là một lựa chọn tốt. ( more1 , more2 )
rsync --delete
sẽ chỉ xóa các tệp khác không phải là một phần của nguồn. Từ [man rsync] () * xóa các tệp không liên quan khỏi các dir dir *. Hiểu ý nghĩa ngoại lai : Không được đồng bộ hóa. Và có, rsync cũng cung cấp một cách để loại bỏ các tệp nguồn sau khi chúng được truyền chính xác.
cmp
thay vì băm. Nó có sự phụ thuộc và những vấn đề tương tự vớiwhile read
Gilles đã đề cập. Nó cũng chậm và dài dòng. Nhưng nó giải phóng không gian đĩa sớm hơn phương thức rsync, vì các tệp được (được) di chuyển khỏi nguồn khi nó chạy. Nó có thể phục vụ như là nguồn cảm hứng cho những người dũng cảm.