rsync: пропускать файлы, для которых у меня нет разрешений

16

Я использую, rsync -rlptDчтобы скопировать каталог от другого пользователя. Есть несколько файлов (я не знаю их заранее), которые я не имею права копировать. Есть ли способ, чтобы rsync игнорировал их? Проблема в том, что если rsync вернет ненулевое значение, мой скрипт bash -x завершится.

JeffCharter
источник
Rsync имеет хорошо документированные значения выхода. Вы не должны рассматривать их как провал, если ваша ситуация не требует провала.
Иордания
@jordanm Но нет кода ошибки, достаточно конкретного, чтобы точно определить эту ошибку.
Жиль "ТАК - перестань быть злым"

Ответы:

7

Rsync не имеет возможности для этого. Я вижу два решения. Одним из них является анализ сообщений об ошибках rsync; это не очень надежно Другой - создать список нечитаемых файлов для фильтрации.

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"

Если у вас findнет -readableи -executableзамените их соответствующей -permдирективой.

Это предполагает, что нет нечитаемых файлов, имя которых содержит символ новой строки. Если вам нужно справиться с этим, вам нужно создать список файлов с нулевым разделением, как этот, и передать -0параметр rsync:

find . \( ! -readable -o -type d ! -executable \) -print0 |
  perl -0000 -pe 's:\A\./:/:' -e 's:[?*\\[]:$1:g' >>"$exclude_file"
Жиль "ТАК - перестань быть злым"
источник
Это, вероятно, его лучшая ставка. Надеюсь, ему нужно запустить его только один раз, так как иметь stat()каждый файл дважды (один раз через rsync и один раз через find) было бы довольно плохо.
Иордания
@ Жиль, похоже, это работает, за исключением скрытых файлов. Я предполагаю, что та же самая стратегия будет работать с некоторыми незначительными изменениями. Я не знаком с \! (восклицательный знак) Вы могли бы это объяснить?
JeffCharter
1
@JeffC \!цитирует !оператора, чтобы защитить его от расширения оболочки. Обратная косая черта здесь на самом деле не нужна, поскольку никакая оболочка не расширяется, !когда за ней следует пробел, но это не повредит. Что не так со скрытыми файлами?
Жиль "ТАК - перестань быть злым"
3

Я сделал простой обходной путь для этой конкретной ситуации:

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

Это возвращает, 0если возвращенный код был 0 или 23, и возвращает код завершения во всех других случаях.

Однако важно отметить, что при этом будут игнорироваться все Partial transfer due to errorошибки, а не только ошибки разрешения , поскольку он будет перехватывать все, что выходит из кода.23 . Для получения дополнительной информации о кодах состояния rsync перейдите по этой ссылке .

Гас
источник