rsync: ignora arquivos para os quais não tenho permissões

16

Estou usando rsync -rlptDpara copiar um diretório de outro usuário. Existem alguns arquivos (não tenho como conhecê-los com antecedência) que não tenho permissão para copiar. Existe uma maneira de rsync ignorá-los. O problema é que, se o rsync retornar diferente de zero, o script bash -x será encerrado.

JeffCharter
fonte
Rsync tem valores de saída bem documentados. Você não deve tratar todos eles como um fracasso se sua situação não exigir que seja um fracasso.
jordanm
@ Jordanm Mas não há código de erro específico o suficiente para identificar apenas esse erro.
Gilles 'stop SO estar mal'

Respostas:

7

O Rsync não tem uma opção para isso. Eu vejo duas soluções. Uma é analisar as mensagens de erro do rsync; isso não é muito robusto. O outro é gerar uma lista de arquivos ilegíveis 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"

Se você findnão possui -readablee -executable, substitua-os pela -permdiretiva apropriada .

Isso pressupõe que não há arquivos ilegíveis cujo nome contenha uma nova linha. Se você precisar lidar com isso, precisará produzir uma lista de arquivos delimitada por nulos como esta e passar a -0opção pararsync :

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"
Gilles 'SO- parar de ser mau'
fonte
Esta é provavelmente a sua melhor aposta. Felizmente, ele só precisa executar isso uma vez, pois ter que stat()cada arquivo duas vezes (uma vez via rsync e outra via find) seria muito ruim.
Jordanm #
@ Gilles isso parece funcionar, exceto para arquivos ocultos. Estou assumindo que a mesma estratégia funcionará com alguns pequenos ajustes. Eu não estou familiarizado com o \! (exclamação): você poderia explicar isso?
JeffCharter
11
@JeffC \!cita o !operador para protegê-lo contra a expansão do shell. A barra invertida não é realmente necessária aqui, pois nenhum shell se expande !quando é seguido por um espaço, mas não dói. O que há de errado com arquivos ocultos?
Gilles 'SO- stop be evil'
2

Fiz uma solução simples para esta situação específica:

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

Isso retorna 0se o código retornado for 0 ou 23 e retorna o código de saída em todos os outros casos.

É importante observar, no entanto, que isso ignoraria todos os Partial transfer due to errorerros, não apenas os de permissão , pois capturaria tudo o que sai do código 23. Para obter mais informações sobre os códigos de status do rsync, consulte este link .

Gus
fonte