Come eliminare directory di origine vuote quando si spostano le cartelle con rsync?


8

rsyncpuò essere persuaso a spostare le cartelle in modo molto simile e superiore al tradizionale mvcon le seguenti opzioni:

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

Comunque una cosa che non riesco ancora a farlo è rimuovere le directory originali. Il --remove-source-filesflag fa proprio questo, rimuove i file di origine, ma non anche le directory di origine. Vorrei che ci fosse anche una --remove-source-directoriesbandiera, ma non c'è.

Come posso gestirlo? Suppongo che posso semplicemente rilasciare una rm -frmossa successiva, tuttavia preferirei mantenere la procedura tutta in un processo rispetto all'introduzione di un potenziale errore.


Qual è il motivo per cui non lo usi mv?
Nils,

1
Volumi diversi e ho bisogno di preservare tutti gli attributi, compresi i tempi.
illuminerà il


1
Sono molto sorpreso che rsync non abbia alcuna opzione per questo, specialmente quando lo fa sul lato destinazione. find . -type d -empty | xargs rmdir -p
Finisco

Sai @ Sridhar-Sarnobat, non posso fare a meno di chiedermi se esiste un modo per passare i risultati di una rsyncsessione in un elenco che viene quindi elaborato seguendo il processo che lo ripulisce ... Hmm.
Illumina

Risposte:


4

Non ho trovato un comando che lo fa in una volta sola, ma poiché rsync funziona ancora meglio di rm -rf(specialmente se hai un numero molto elevato di directory) ecco due comandi rsync che fanno una "mossa" :

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

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/ && 
ssh server find incoming -type d -delete

Questo NON rimuoverà le directory se non sono vuote.


Nota che apparentemente potrebbe essere necessario aggiungere -depthsu OSX o altri.
Charlie Gorichanaz,

3

Sono finito in una situazione simile. Volevo evitare rm -rf, sapendo che rsync non è riuscito a copiare alcuni file e non volevo perderli.

Per eliminare semplicemente le directory vuote, ho trovato questo il più conveniente (da sourcedir):

find . -type d -empty -delete

Sì, meno male per -vuoto, che ho scoperto solo di recente ed è diventato molto comune per me usare.
Sridhar Sarnobat,

2

Perché non aggiungere semplicemente rm -rf source_directorydopo il tuo rsync?

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

Ogni programma da riga di comando è (ideato) realizzato per svolgere un'attività specifica, e spetta a te incollarne diversi insieme per svolgere attività più complesse.


2
Penso tu abbia ragione. Credo che alla fine dovrò scavare prima fino in fondo perché non riesco a farmi catturare semplicemente muovendo come fa normalmente rsync. Probabilmente bisogno di usare find -depth. Avresti qualche suggerimento su un rapido approccio algoritmico per scendere in fondo allo stack dir, mv'ing con rsync, rm'ing come noti e poi tornare indietro sull'albero?
illuminerà il
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.