rsync: пропустити файли, на які я не маю дозволів


16

Я використовую rsync -rlptDдля копіювання каталогу від іншого користувача. Є кілька файлів (я не можу їх знати заздалегідь), які я не маю дозволу копіювати. Чи є спосіб, щоб rsync їх ігнорував. Проблема в тому, що якщо rsync поверне не нульовий, мій скрипт bash -x вийде.


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 та один раз через пошук) була б дуже поганою.
Йорданм

@Gilles, здається, працює, за винятком прихованих файлів. Я припускаю, що та сама стратегія буде працювати з незначними налаштуваннями. Я не знайомий з \! (похилий вигук) ви могли б це пояснити?
JeffCharter

1
@JeffC \!цитує !оператора, щоб захистити його від розширення оболонки. Зворотна косої риси насправді тут не потрібна, оскільки жодна оболонка не розширюється, !якщо за нею пробіл, але вона не болить. Що не так із прихованими файлами?
Жил "ТАК - перестань бути злим"

3

Я зробив просте рішення для цієї конкретної ситуації:

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

Це повертається 0 якщо повернений код був 0 або 23, і повертає вихідний код у всіх інших випадках.

Важливо зауважити, що це дозволить ігнорувати всі Partial transfer due to errorпомилки, а не лише дозвольні , оскільки це дозволить зафіксувати все, що виходить з коду 23. Для отримання додаткової інформації про коди статусу rsync перейдіть за цим посиланням .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.