Pindahkan file dan hapus direktori dengan rsync?


17

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/directoriessangat 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 ~/destinationdirektori saya memiliki file yang harus disimpan, jadi mvbukan pilihan. Saya menemukan opsi --prune-empty-dirsdan --forcersync, 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?


2
Jika Anda tidak mendapatkan jawaban di sini, coba posting di daftar rsync. Mereka sangat membantu. lists.samba.org/mailman/listinfo/rsync
Joe

Jawaban:


7

Saya menemukan utas ini di stackoverflow berjudul: Menghapus folder dengan rsync "move"? , yang pada dasarnya menanyakan pertanyaan yang sama. Salah satu jawaban menyarankan untuk melakukanrsync dalam 2 karena tampaknya tidak ada perintah tunggal yang dapat menyelesaikan pemindahan / penghapusan file dan direktori sumber.

$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \
  rsync -av --delete `mktemp -d`/ source/ && rmdir source/

Atau Anda dapat melakukannya menggunakan perintah ini:

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

Tidak ideal tetapi melakukan pekerjaan.


Ya, sayalah yang menjawab pertanyaan itu (dan "solusi" yang sama juga ada pada pertanyaan ini). = P
Alix Axel

@AlixAxel - Ha, maaf saya bahkan tidak melihat Anda menjawab yang itu. Baiklah. Haruskah saya menghapus jawaban ini?
slm

3
Menggunakan rsyncuntuk memangkas direktori tidak terasa benar dan selalu ada bahaya rm -rf. Saya akan merekomendasikan langkah ke-2:find source/ -d -type d -exec rmdir {} \;
zany

2
Saya hanya merasa harus menambahkan, tidak pernah menggunakan -deletedan --remove-source-filesdalam 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 :(
Sridhar Sarnobat

Saat berbenah 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.
greyfade

10

Dari komentar zany hingga jawaban slm ( Pindahkan file dan hapus direktori dengan rsync? ) Saya akan merekomendasikan 2 perintah ini sebagai jawaban:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

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)


kenapa tidak hanya -deletebukan -exec rmdir {} \;?
domba terbang

@flying_sheep lihat komentar pengguna7 dalam jawaban sim: ketika rsync ist terganggu Anda bisa kehilangan file
mit

Ketika rsync terganggu, penemuan tidak pernah dimulai atau tidak? Jadi -hapus dalam rsync kedua seharusnya tidak menjadi masalah. Tapi -delete juga menghapus file, bukan rmdir tidak pernah menghapus file, hanya direktori. Keduanya (-delete dan rmdir) memeriksa direktori jika kosong sebelum menghapus.
benba

Lebih jauh lagi, halaman manual mengatakan Anda harus menggunakan -execdir alih-alih ...
benba

2

Ini melakukan pekerjaan dalam satu langkah. Perhatikan trailing / slash / pada jalur sumber dan target.

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

Saya mengulangi peringatan dari user7000 untuk tidak menggunakan --deletedan --remove-source-filesbersama-sama dalam panggilan yang sama rsync. Jika operasi gagal atau terputus dan panggilan yang sama diulang, Anda akan kehilangan data. Jika di setiap ragu, gunakan --dry-runopsi untuk melihat apa yang akan dilakukan.


-ruvalsepertinya berlebihan. -asetara dengan -rlptgoD, yang mencakup keduanya -rdan -l.
greyfade
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.