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.


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.


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.


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.


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


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

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.