rsync: salta i file per i quali non ho i permessi


16

Sto usando rsync -rlptDper copiare una directory da un altro utente. Ci sono alcuni file (non ho modo di conoscerli in anticipo) che non ho il permesso di copiare. C'è un modo in cui rsync li ignora. Il problema è che se rsync ritorna diverso da zero il mio script bash -x uscirà.


Rsync ha valori di uscita ben documentati. Non dovresti trattarli tutti come un fallimento se la tua situazione non richiede che sia un fallimento.
Giordania,

@jordanm Ma non esiste un codice di errore sufficientemente specifico per individuare solo questo errore.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


7

Rsync non ha un'opzione per questo. Vedo due soluzioni. Uno è analizzare i messaggi di errore di rsync; questo non è molto robusto. L'altro è generare un elenco di file illeggibili da filtrare.

cd /source/directory
exclude_file=$(mktemp)
find . ! -readable -o -type d ! -executable |
  sed -e 's:^\./:/:' -e 's:[?*\\[]:\\1:g' >>"$exclude_file"
rsync -rlptD --exclude-from="$exclude_file" . /target/directory
rm "$exclude_file"

Se il tuo findnon ha -readablee -executable, sostituiscili con la -permdirettiva appropriata .

Ciò presuppone che non ci siano file illeggibili il cui nome contiene una nuova riga. Se devi affrontarli, dovrai produrre un elenco di file delimitati da null come questo e passare l' -0opzione a rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"

Questa è probabilmente la sua migliore scommessa. Si spera che abbia bisogno di eseguirlo solo una volta, dato che dover fare stat()ogni file due volte (una volta tramite rsync e una volta tramite find) sarebbe piuttosto male.
Giordania,

@Gilles sembra funzionare, ad eccezione dei file nascosti. Suppongo che la stessa strategia funzionerà con alcune modifiche minori. Non ho familiarità con il \! (esclamazione della barra) potresti spiegarlo?
JeffCharter,

1
@JeffC \!cita l' !operatore per proteggerlo dall'espansione della shell. La barra rovesciata non è effettivamente necessaria qui poiché nessuna shell si espande !quando è seguita da uno spazio, ma non fa male. Cosa c'è che non va nei file nascosti?
Gilles 'SO- smetti di essere malvagio' il

3

Ho fatto una semplice soluzione per questa situazione specifica:

rsync --args || $(case "$?" in 0|23) exit 0 ;; *) exit $?; esac)

Ciò restituisce 0se il codice restituito era 0 o 23 e restituisce il codice di uscita in tutti gli altri casi.

È importante notare, tuttavia, che ciò ignorerebbe tutti gli Partial transfer due to errorerrori, non solo quelli di autorizzazione , poiché catturerà tutto ciò che esce dal codice 23. Per ulteriori informazioni sui codici di stato rsync, fare riferimento a questo collegamento .

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.