RSYNC non elimina le directory di origine


27

Sto usando rsync per recuperare i file essenziali da un server, quindi eliminare i file dal server una volta che li ho localmente. Il comando completo che sto eseguendo è di seguito.

Ciò elimina correttamente i file sul server di origine, tuttavia rimangono ancora directory vuote. Non ricevo messaggi o errori. Tutto l'output è normale. Forse questa è la funzionalità prevista.

Come posso dire a rsync di pulire tutto, comprese le directory?

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

La versione è 3.0.9 su entrambe le estremità.


Risposte:


13

Il comportamento --remove-source-filesche si osserva è esattamente quello specificato da man rsync:

file --remove-source-

   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.

Non esiste un comando specifico per rimuovere le directory, come mostrano chiaramente queste due discussioni in StackExchange e ServerFault . La soluzione suggerisce che è necessario emettere due comandi separati:

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

L'ultima parte del comando suggerita in questi due post,

 rmdir source/

che è necessario per rimuovere la directory di origine (ora svuotata) ha questa forma in questi post perché gli OP e le risposte utilizzano rsync per spostare grandi quantità di file all'interno della stessa macchina. Nel tuo caso dovrai farlo manualmente.


5
Il rsync --deletesuggerimento è pericoloso, perché ignora la possibilità che rsync non sia stato completato o che ci siano nuovi file alla fonte. Il findmetodo di @ slhck qui sotto è molto più sicuro.
Sai,

29

La manpage dice anche:

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

Se vuoi rimuovere directory vuote nella tua fonte, se ci sono ancora file rimasti, fai un:

find . -depth -type d -empty -delete

Ma per una directory radice vuota, rm -rf <directory>ovviamente è sufficiente una volontà.


5
sì, questa è l'unica soluzione. è una specie di sciocca caratteristica di rsync ... rsync sa quando ha elaborato l'ultimo file in una directory ... è abbastanza facile rimuovere anche la directory se è vuota.
Erik Aronesty,

4
Attenzione che l'emissione di "rm -rf" è soggetta alle condizioni di gara e la scoraggio.
Raúl Salinas-Monteagudo,

Variante che non cancella la directory vuota di livello superiore:find some_dir -depth -type d -empty -not -path some_dir -delete
Cameron Tacklind,

5

L'uso di " rm -rf " ha una condizione di gara intrinseca, è possibile eliminare i file appena creati tra le invocazioni rsync e rm .

Preferisco usare:

rsync --remove-source-files -a server: incoming / incoming / &&

il server ssh trova -type d -delete in arrivo

Questo NON rimuoverà le directory se non sono vuote.


2
La rm -rfsaranno anche rimuovere i file che non sono stati trasferiti per qualche motivo.
Kristian,

1
Questa risposta manca l' -depthopzione che indica finddi elaborare nel giusto ordine. Come risultato di questa mancanza, le directory che contengono solo directory vuote (possibilmente ricorsivamente) non verranno eliminate. La variante di @slhck ha ragione.
Stéphane Gourichon,

1

-m, --prune-empty-dirs elimina le catene di directory vuote dall'elenco dei file

--force forza la cancellazione delle directory anche se non vuote


1
Ciò impedisce a rsync di copiare directory vuote. Non elimina le directory vuote.
Navin,

1

Rimuovere i file di origine, quindi rimuovere le directory per sicurezza.

# 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;

Altro su GNU Parallel

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.