rsync: saltar archivos para los que no tengo permisos

16

Estoy usando rsync -rlptDpara copiar un directorio de otro usuario. Hay algunos archivos (no tengo forma de saberlos de antemano) que no tengo permiso para copiar. ¿Hay alguna manera de que rsync los ignore? El problema es que si rsync devuelve un valor distinto de cero, mi script bash -x se cerrará.

JeffCharter
fuente
Rsync tiene valores de salida bien documentados. No debe tratarlos a todos como un fracaso si su situación no exige que sea un fracaso.
jordanm 01 de
@jordanm Pero no hay un código de error que sea lo suficientemente específico como para señalar este error únicamente.
Gilles 'SO- deja de ser malvado'

Respuestas:

7

Rsync no tiene una opción para esto. Veo dos soluciones. Una es analizar los mensajes de error de rsync; Esto no es muy robusto. El otro es generar una lista de archivos ilegibles para filtrar.

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"

Si findno tiene -readabley -executable, reemplácelos por la -permdirectiva correspondiente .

Esto supone que no hay archivos ilegibles cuyo nombre contenga una nueva línea. Si necesita hacer frente a ellos, deberá generar una lista de archivos delimitados por nulos como esta, y pasar la -0opción a rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"
Gilles 'SO- deja de ser malvado'
fuente
Esta es probablemente su mejor apuesta. Con suerte, solo necesita ejecutar esto una vez, ya que tener que hacer stat()cada archivo dos veces (una vez a través de rsync y una vez a través de buscar) sería bastante malo.
jordanm
@Gilles esto parece funcionar, a excepción de los archivos ocultos. Supongo que la misma estrategia funcionará con algunos ajustes menores. No estoy familiarizado con el \! (slash exclamación) ¿podrías explicar eso?
JeffCharter
1
@JeffC \!cita al !operador para protegerlo contra la expansión de shell. La barra invertida no es realmente necesaria aquí ya que ningún shell se expande !cuando es seguido por un espacio, pero no duele. ¿Qué hay de malo con los archivos ocultos?
Gilles 'SO- deja de ser malvado'
3

Hice una solución simple para esta situación específica:

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

Esto devuelve 0si el código devuelto fue 0 o 23, y devuelve el código de salida en todos los demás casos.

Sin embargo, es importante tener en cuenta que esto ignoraría todos los Partial transfer due to errorerrores, no solo los de permiso , ya que detectará todo lo que salga del código 23. Para obtener más información sobre los códigos de estado de rsync, consulte este enlace .

Gus
fuente