In una rsync, come posso escludere tutte le directory che corrispondono a un modello?


8

In una rsync sto cercando di escludere le sottodirectory che corrispondono a un modello. Ma non riesco a farlo funzionare. Ho seguito diversi esempi trovati qui e su Google. Ma non ottengo i risultati corretti. Ecco l'opzione bit del mio comando:

-avh --exclude 'branch*' --stats --delete --link-dest=$LNK

La mia struttura di directory di origine è

/root
    /branch1
    /branch2
    /branch3
    /other
    /stillAnother
    /etc

Questo fa parte di uno script di backup. $ LNK è un collegamento alla destinazione rsync del giorno precedente.

Non voglio / root / branch1, / root / branch2, / root / branch3. o il loro contenuto da sincronizzare. Ma loro sono.

Ecco i bit di esclusione che ho già provato:

--exclude=branch*
--exclude='branch*'
--exclude '/branch*'
--exclude /branch*

Grazie per qualsiasi aiuto / consiglio.

EDIT - per indirizzare il flag "possibile duplicato"

Questa domanda riguarda un elenco noto di directory. Devo escludere qualsiasi directory che segua un modello, anche se quelle directory non esistono ancora. cioè dal mio esempio, /branch*possono essere aggiunte altre directory nominate . Devo rendere il mio script a prova di futuro ed evitare di modificarlo quando viene aggiunta una directory che corrisponde allo schema, poiché tali directory potrebbero essere temporanee.


il tuo parametro exclude è ok. Se rsync ignora il ramo * durante la copia, lo ignora anche quando si elimina da dest, quindi è necessario eliminare manualmente queste directory una volta.
Ipor Sircer,

la destinazione è una nuova directory vuota, creata dal mio script bash. Ho cancellato le directory branch * dalla directory link-dest, senza risultati.
Roger Creasy,

1
È necessario utilizzare un modello completo esplicito simile *branch*o /root/branch*meno alla branch*forma breve - corta non trovata e quindi non esclusa.
Kondybas,

@Kondybas Quindi, tutto va bene nelle mie opzioni tranne che ho bisogno di anteporre un '*' al mio ramo di esclusione? ( --exclude '*branch*)
Roger Creasy,

Risposte:


2

La regola escludi è corretta. Tuttavia, rsync non eliminerà i file esclusi sulla destinazione senza il parametro aggiuntivo --delete-excluded:

--delete-excluded also delete excluded files from dest dirs

Esempio:

#  tree test
test
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

#  tree test2
test2
|-- 123
|-- branch1
|-- branch2
|-- branch3
`-- other

# rsync -avh test/ test2 --delete --exclude='branch1' --delete-excluded
sending incremental file list
deleting branch1/

sent 140 bytes  received 27 bytes  334.00 bytes/sec
total size is 0  speedup is 0.00

#  tree test2
test2
|-- 123
|-- branch2
|-- branch3
`-- other

3 directories, 1 file

Ho modificato le mie opzioni nello script in -avh --exclude 'branch*' --stats --delete --delete-excluded --link-dest=$LNKBackup della notte scorsa ancora eseguito il backup delle directory / branch *.
Roger Creasy,

1

rsync versione 3.1.3 (possibilmente precedente, non verificato) esclude correttamente le sottodirectory usando questa sintassi (ovviamente sostituendo exclude_dirnamecon il pattern che si desidera escludere):

rsync [other opts...] --exclude='*/exclude_dirname/' /src/ /dst/

Questo funziona anche con i caratteri jolly. La domanda originale utilizza 'branch*', quindi funziona:

rsync [other opts...] --exclude='*/branch*/' /src/ /dst/

Spero che sia di aiuto.

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.