Bagaimana cara menghapus direktori sumber kosong ketika memindahkan folder dengan rsync?

8

rsyncdapat dibujuk ke folder bergerak sangat mirip dan superior tradisional mvdengan opsi berikut:

rsync -axvvES --remove-source-files source_directory /destination/

Namun satu hal yang belum bisa saya lakukan adalah menghapus direktori asli. The --remove-source-filesbendera tidak hanya itu, menghapus file sumber, tapi tidak juga direktori sumber. Saya berharap ada --remove-source-directoriesbendera juga, tetapi tidak ada.

Bagaimana saya bisa mengatasi ini? Saya kira saya bisa mengeluarkan langkah rm -frsetelah pindah, tetapi saya lebih suka untuk menjaga prosedur semua dalam satu proses vs memperkenalkan potensi kesalahan.

kamu akan menyatu
sumber
Apa alasan Anda tidak menggunakan mv?
Nils
1
Volume berbeda dan saya perlu mempertahankan semua atribut, termasuk waktu.
yumuminasi
1
Kebutuhan yang sama di sini unix.stackexchange.com/q/78375/3858 .
Alix Axel
1
Saya sangat terkejut rsync tidak memiliki pilihan untuk ini, terutama ketika itu dilakukan di sisi tujuan. Saya akhirnya melakukanfind . -type d -empty | xargs rmdir -p
Sridhar Sarnobat
Anda tahu @ Sridhar-Sarnobat Saya tidak bisa tidak bertanya-tanya apakah ada cara untuk melewatkan hasil dari rsyncsesi ke daftar yang kemudian diproses mengikuti proses yang kemudian membersihkannya ... Hmm.
ylluminate

Jawaban:

4

Saya belum menemukan perintah yang melakukan itu sekaligus, tetapi karena rsync masih berkinerja lebih baik daripada rm -rf(khususnya jika Anda memiliki banyak direktori), berikut adalah dua perintah rsync yang melakukan "perpindahan" :

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
Alix Axel
sumber
5

Menggunakan " rm -rf " memiliki kondisi ras yang melekat, Anda dapat menghapus file yang baru saja dibuat antara rsync dan permintaan rm .

Saya lebih suka menggunakan:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

Ini TIDAK akan menghapus direktori jika tidak kosong.

Raúl Salinas-Monteagudo
sumber
Catatan Anda tampaknya perlu menambahkan -depthpada OSX atau yang lain.
Charlie Gorichanaz
3

Saya berakhir dalam situasi yang sama. Saya ingin menghindari rm -rf, mengetahui bahwa rsync gagal menyalin beberapa file, dan saya tidak ingin kehilangan mereka.

Untuk hanya menghapus direktori kosong, saya menemukan ini yang paling nyaman (dari sourcedir):

find . -type d -empty -delete
lp_
sumber
Yap, syukurlah untuk -kosong, yang baru saya temukan baru-baru ini dan itu menjadi sangat umum untuk saya gunakan.
Sridhar Sarnobat
2

Mengapa tidak menambahkan rm -rf source_directorysetelah rsync Anda?

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

Setiap program baris perintah (idealy) dibuat untuk melakukan tugas yang ditentukan, dan terserah Anda untuk merekatkan beberapa bersama untuk menyelesaikan tugas yang lebih kompleks.

Gregory MOUSSAT
sumber
2
Saya pikir kamu benar. Saya percaya saya pada akhirnya harus menelusuri ke bawah juga pertama karena saya tidak bisa tertangkap hanya bergerak seperti rsync biasanya. Mungkin perlu digunakan find -depth. Apakah Anda punya saran untuk pendekatan algoritmik cepat untuk turun ke bagian bawah tumpukan stack, mv'ing dengan rsync, rm'ing seperti yang Anda perhatikan, dan kemudian melangkah kembali ke atas pohon?
yumuminasi