RSYNC Tidak Menghapus Direktori Sumber

27

Saya menggunakan rsync untuk mengambil file penting dari server, kemudian menghapus file dari server begitu saya memilikinya secara lokal. Perintah lengkap yang saya jalankan ada di bawah.

Ini berhasil menghapus file di server sumber, namun direktori kosong masih tetap ada. Saya tidak mendapatkan pesan atau kesalahan. Semua output normal. Mungkin ini adalah fungsi yang dimaksudkan.

Bagaimana saya bisa memberitahu rsync untuk membersihkan semuanya, termasuk direktori?

rsync --progress -vrzh --remove-source-files

Versi 3.0.9 di kedua ujungnya.

Sajan Parikh
sumber
Terkait: unix.stackexchange.com/questions/78375/… | serverfault.com/questions/384110/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

13

Perilaku --remove-source-filesyang Anda amati persis seperti yang ditentukan oleh man rsync:

--Hapus sumber-file

   This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.

Tidak ada perintah khusus untuk menghapus direktori, karena dua diskusi di StackExchange dan ServerFault ini jelas ditampilkan. Solusi yang disarankan adalah mengeluarkan dua perintah terpisah:

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

Bagian terakhir dari perintah yang disarankan dalam dua posting ini,

 rmdir source/

yang diperlukan untuk menghapus direktori sumber (sekarang dikosongkan) memiliki formulir ini dalam posting ini karena OP dan jawabannya menggunakan rsync untuk memindahkan sejumlah besar file dalam mesin yang sama. Dalam kasus Anda, Anda harus melakukan ini secara manual.

MariusMatutiae
sumber
5
The rsync --deletesaran adalah berbahaya, karena mengabaikan kemungkinan bahwa rsync itu tidak selesai, atau ada file baru pada sumbernya. Metode @ slhck di findbawah ini jauh lebih aman.
Sai
29

Halaman buku itu bahkan mengatakan:

--remove-source-files   sender removes synchronized files (non-dirs)

Jika Anda ingin menghapus direktori kosong di sumber Anda, jika masih ada file, lakukan:

find . -depth -type d -empty -delete

Tetapi untuk direktori root kosong, rm -rf <directory>tentu saja sudah cukup.

slhck
sumber
5
ya, ini satu-satunya solusi. itu semacam fitur rsync yang konyol yang hilang ... rsync tahu kapan ini memproses file terakhir dalam sebuah direktori ... cukup mudah untuk menghapus dir juga jika itu kosong.
Erik Aronesty
4
Waspadalah bahwa mengeluarkan "rm -rf" rentan terhadap kondisi ras dan saya tidak menganjurkannya.
Raúl Salinas-Monteagudo
Varian yang tidak menghapus direktori kosong tingkat atas:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind
5

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

Saya lebih suka menggunakan:

rsync --hapus-sumber-file -a server: masuk / masuk / &&

ssh server mencari -type d -delete yang masuk

Ini TIDAK akan menghapus direktori jika tidak kosong.

Raúl Salinas-Monteagudo
sumber
2
Itu rm -rfjuga akan menghapus file yang tidak ditransfer karena alasan tertentu.
Kristian
1
Jawaban ini melewatkan -depthopsi yang memerintahkan finduntuk memproses dalam urutan yang benar. Sebagai hasil dari kehilangan ini, direktori yang hanya berisi direktori kosong (mungkin secara rekursif) tidak akan dihapus. Varian oleh @slhck sudah benar.
Stéphane Gourichon
1

-m, --prune-empty-dirs pangkas rantai direktori kosong dari daftar file

--force penghapusan paksa dir bahkan jika tidak kosong

Marco
sumber
1
Itu hanya mencegah rsync dari menyalin direktori kosong. Itu tidak menghapus direktori kosong.
Navin
1

Hapus file sumber, lalu hapus direktori agar aman.

# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;

Lebih lanjut tentang GNU Parallel

Daniel Andrei Mincă
sumber