Baru-baru ini saya perlu menghapus sejumlah besar file (lebih dari 1 juta) dan saya membacanya dengan melakukan:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Adalah salah satu cara paling optimal untuk melakukan itu, dan saya dapat memastikan bahwa itu lebih cepat daripada rm -rf
.
Saya bukan ahli dalam masalah ini, tetapi dari pemahaman saya alasan kinerja rsync ada hubungannya dengan cara daftar file (LIFO bukan FIFO saya kira). Sekarang, masalahnya adalah, saya juga perlu memindahkan sejumlah besar file dengan cara yang efisien. Setelah mencari sedikit, saya menemukan ini:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Sementara ini menghapus semua pindah file di ~/source
, direktori tetap ada. Karena saya memiliki struktur direktori seperti round-robin, maka jumlahnya files/directories
sangat dekat dengan 1, jadi saya terpaksa menjalankan perintah pertama lagi untuk menyingkirkan direktori sepenuhnya:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Lurus mv
akan selesai secara instan, tetapi ~/destination
direktori saya memiliki file yang harus disimpan, jadi mv
bukan pilihan. Saya menemukan opsi --prune-empty-dirs
dan --force
rsync, tetapi tampaknya tidak berfungsi seperti yang saya harapkan:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
Apakah ada cara untuk meniru gerakan dengan rsync sekaligus?
Jawaban:
Saya menemukan utas ini di stackoverflow berjudul: Menghapus folder dengan rsync "move"? , yang pada dasarnya menanyakan pertanyaan yang sama. Salah satu jawaban menyarankan untuk melakukan
rsync
dalam 2 karena tampaknya tidak ada perintah tunggal yang dapat menyelesaikan pemindahan / penghapusan file dan direktori sumber.Atau Anda dapat melakukannya menggunakan perintah ini:
Tidak ideal tetapi melakukan pekerjaan.
sumber
rsync
untuk memangkas direktori tidak terasa benar dan selalu ada bahayarm -rf
. Saya akan merekomendasikan langkah ke-2:find source/ -d -type d -exec rmdir {} \;
-delete
dan--remove-source-files
dalam satu perintah rsync (contoh di atas baik-baik saja, ini tangensial). Jika Anda menyela kemudian menjalankan kembali apa yang saya jelaskan, Anda akan kehilangan file yang ditransfer. Yang sudah saya lakukan sebelumnya :(find
, saya lebih suka ini:find source/ -type d -empty -delete
Ini memberi saya rasa jaminan yang aneh bahwa itu tidak hanya akan menghancurkan segalanya.Dari komentar zany hingga jawaban slm ( Pindahkan file dan hapus direktori dengan rsync? ) Saya akan merekomendasikan 2 perintah ini sebagai jawaban:
Keuntungannya, seperti kata Zany, masih ada beberapa bahaya dalam menggunakan rm -rf jika Anda tidak melakukannya dengan benar atau untuk pemula.
Saya menambahkan 2 opsi, -depth dan -empty dan sementara saya tidak yakin apakah ini benar-benar diperlukan, itu membuat perintah ke-2 lebih portabel untuk situasi lain dan bahkan lebih aman (masih melakukan hal yang benar jika beberapa direktori tidak kosong dan mulai menghapus dari titik terdalam di pohon direktori)
sumber
-delete
bukan-exec rmdir {} \;
?Ini melakukan pekerjaan dalam satu langkah. Perhatikan trailing / slash / pada jalur sumber dan target.
Saya mengulangi peringatan dari user7000 untuk tidak menggunakan
--delete
dan--remove-source-files
bersama-sama dalam panggilan yang samarsync
. Jika operasi gagal atau terputus dan panggilan yang sama diulang, Anda akan kehilangan data. Jika di setiap ragu, gunakan--dry-run
opsi untuk melihat apa yang akan dilakukan.sumber
-ruval
sepertinya berlebihan.-a
setara dengan-rlptgoD
, yang mencakup keduanya-r
dan-l
.