it-swarm.it

Eliminare file estranei dalla directory di destinazione tramite rsync?

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?

51
Cheng

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

--Elimina

Questo dice a rsync di eliminare i file estranei dal lato di ricezione (quelli che non sono dal lato di invio), ma solo per le directory che vengono sincronizzate. Devi aver chiesto a rsync di inviare l'intera directory (es. "Dir" o "dir /") senza usare un carattere jolly per il contenuto della directory (es. "Dir/*") poiché il carattere jolly è espanso da Shell e rsync riceve così una richiesta di trasferimento di singoli file, non della directory principale dei file. I file esclusi dal trasferimento sono esclusi dall'eliminazione a meno che non si usi il - elimina opzione esclusa o contrassegna le regole come corrispondenti solo sul lato di invio (vedi 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 modello --exclude '*'. L'opzione --delete-excluded Assicura che anche i file esclusi sul lato DEST vengano eliminati.

73
Steven D