L'opzione Rsync --delete non cancella i file nella directory di destinazione


14

Sto cercando di utilizzare l' --deleteopzione in rsyncper eliminare i file nella directory di destinazione che non è presente nella directory originale

Ecco il comando che sto usando:

rsync -avz --ignore-existing --recursive --delete /var/www/* root@mydomaintest.com:/var/www

Quindi la mia domanda è: come posso eliminare tutti i file nella directory di destinazione che non sono presenti nella directory originale?

Risposte:


14

Usa questo comando:

rsync --archive --verbose --compress --ignore-existing --delete /var/www/ root@mydomaintest.com:/var/www

Non hai bisogno di un "*" e non dovresti usarlo anche tu.

Per escludere / includere file o directory, è necessario utilizzare questi parametri:

--exclude 'to_exclude*'
--include 'to_include*'

Bene, lasciami provare :)
user2028856

2
Quindi il "*" che sta causando il comando --delete non funziona?
user2028856

2
Ecco come appare. :)
AB

3
--recursiveè sovrabbondante perché l'opzione -alo include già
Temak

1
"*" Potrebbe essere importante in alcuni casi perché esclude file / directory che iniziano con ".". Ad esempio, lo uso quando utilizzo rsync per copiare una directory gestita sotto git da una macchina di sviluppo a una macchina di produzione. Non voglio sincronizzare la directory del repository .git o file come .gitignore, solo l'albero di lavoro, inclusi i file di livello superiore e le sottodirectory.
sootsnoot,

14

Il tuo comando non funzionava perché quando stavi usando /var/www/*come sorgente, la tua shell stava eseguendo il globbing su di essa, cioè la shell si espandeva *a tutti i file in quella directory e la copia dei file uno per uno, quindi qui i singoli file sono diventati i sorgenti anziché la directory principale.

Quindi, se lo usi /var/www/*, non hai bisogno --recursivedell'opzione poiché *i file verranno copiati (insieme a tutte le directory con il loro contenuto), non la directory padre che contiene i file. A causa dello stesso motivo --deletenon funziona, in quanto --deleterimuoverà i file dalla directory di destinazione che non si trovano nella directory di origine , ma si stanno copiando i file in modo che non rimuovano i file (prevedibilmente).

Questo ti renderà più chiaro:

/foo$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test


/bar$ ls -l
-rw-rw-r-- 1 user user 0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user 0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user 0 Apr 16 17:56 spam


$ rsync -avz --ignore-existing --recursive --delete 
/foo/* /bar/

+ rsync -avz --ignore-existing --recursive --delete 
/foo/egg /foo/spam /foo/test /bar/

sending incremental file list
test/
test/hello

sent 173 bytes  received 39 bytes  424.00 bytes/sec
total size is 0  speedup is 0.00


/bar$ ls -l
-rw-rw-r-- 1 user user    0 Apr 16 17:56 egg
-rw-rw-r-- 1 user user    0 Apr 16 18:13 lion
-rw-rw-r-- 1 user user    0 Apr 16 17:56 spam
drwxrwxr-x 2 user user 4096 Apr 16 18:14 test

Come puoi vedere, ho usato la fonte in quanto /foo/*quindi il rsynccomando da eseguire è

rsync -avz --ignore-existing --recursive --delete /foo/egg 
/foo/spam /foo/test /bar/

con la *creazione di shell per espanderlo e creare tutti i file singolarmente come argomenti di origine, non la directory padre nel suo insieme (e anche --recursivein questo caso non è necessario ).

Quindi, se vuoi far --deletefunzionare, eseguilo come:

rsync -avz --ignore-existing --recursive --delete 
/var/www/ root@mydomaintest.com:/var/www/

4
Ottima spiegazione sottolineando il vero problema: usare '*' per espandere l'elenco delle fonti.
Antonio Bardazzi,

Come notato nel mio commento sulla risposta accettata, il * può essere utile per escludere cose come file e directory che iniziano con ".". Sebbene, come si nota, ciò significa che i file e le directory rimossi dal livello principale nell'origine non verranno rimossi dalla directory di destinazione. Per quanto mi riguarda, non mi importa se i file di livello superiore vengono eliminati correttamente dalla destinazione, contano solo i file sotto le sottodirectory. Rimuovere una sottodirectory di livello superiore è molto meno probabile che aggiungerne una, e sono disposto a fare un rm -r manuale sulla destinazione in quel caso improbabile.
sootsnoot,
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.