Eliminare file estranei dalla directory di destinazione tramite rsync?


51

Di 'che ho

SRC 
  001.jpg
  002.jpg
  001.txt
  a.zip

DEST
  hello.jpg

rsync -d --delete SRC:{*.jpg,*.txt} DEST

Non rimuove hello.jpg da DEST, hai idea di come archiviarlo?

Risposte:


72

Il motivo per cui il tuo comando non funziona è spiegato dalla pagina di manuale di rsync (enfasi aggiunta):

--Elimina

Questo dice a rsync di eliminare i file estranei dal lato di ricezione (quelli che non si trovano sul lato di invio), ma solo per le directory che vengono sincronizzate. È necessario aver chiesto a rsync di inviare l'intera directory (ad esempio "dir" o "dir /") senza utilizzare un carattere jolly per il contenuto della directory (ad esempio "dir / *") poiché il carattere jolly viene espanso dalla shell e rsync ottiene quindi un richiesta di trasferire singoli file, non la directory principale dei file. I file esclusi dal trasferimento sono anche esclusi dall'eliminazione, a meno che non si usi l'opzione --delete-excluded o si contrassegni le regole come corrispondenti solo sul lato di invio (vedere i modificatori di inclusione / esclusione nella sezione REGOLE DI FILTRO).

Quindi, quando corri

$ rsync -d --delete SRC:{*.jpg,*.txt} DEST

i file indesiderati in DEST non vengono eliminati perché in realtà non hai richiesto la sincronizzazione di una directory, ma solo una manciata di file specifici. Per ottenere i risultati desiderati, prova qualcosa del genere:

rsync -d --delete-excluded --include '*.jpg' --include '*.txt' --exclude '*' SRC/ DEST/

Si noti che l'ordine delle direttive include e exclude. In sostanza, ogni file viene verificato rispetto ai modelli di inclusione o esclusione nell'ordine in cui vengono visualizzati. Pertanto, i file con estensione .jpg o .txt vengono sincronizzati poiché corrispondono ai modelli "inclusi" prima che corrispondano al modello "*" escluso. Tutto il resto è escluso dal --exclude '*'modello. L' --delete-excludedopzione garantisce che anche i file esclusi sul lato DEST vengano eliminati.


@Cheng, ti va di spiegare un po 'di più? Sarei felice di aggiornare la mia risposta in caso di problemi / miglioramenti.
Steven D

Funziona. Suppongo. Le cose --processo mi stanno confondendo, mi fanno pensare che sia stato trasferito di nuovo.
Cheng,

Ho modificato la mia risposta per spiegare un po 'di più.
Steven D,

2
@Cheng: sospetto che tu non voglia --delete-excluded. Senza di essa, solo *.jpge *.txtpuò essere eliminato sul lato destinazione. Con esso, anche i file non correlati verranno eliminati. Potresti essere interessato a questo tutorial sui filtri rsync .
Gilles 'SO- smetti di essere malvagio' il

3
Grazie! Per me mi mancava la barra finale nella directory dei sorgenti.
vaughan,
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.