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.


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/

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.


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

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.


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
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.