Назад | Перейти на главную страницу

Заставить tar игнорировать / пропускать ошибки при сжатии файлов?

Скажем, я делаю это tar cfzp home.tar.gz /home (занимает некоторое время) и файл изменяется во время сжатия и tar терпит неудачу, я получаю «файл изменяется по мере его чтения», и tar останавливается. Я предполагаю, что home.tar.gz теперь неполный, или это было просто "уведомление", а не ошибка?

Есть ли какая-то «принудительная» опция, чтобы tar завершал свою работу и не прерывался при ошибках?

Редактировать / обновить: я обнаружил, что «--ignore-failed-read не завершает работу с ненулевым значением для нечитаемых файлов», и, по крайней мере, я думаю, что это работает. Но нужно быть осторожным с порядком параметров, потому что вы можете получить tar-файл с именем "--ignore-failed-read"

Мне нужно игнорировать что-нибудь еще?

Обновление: без «--ignore-failed-read» tar продолжит работу, если файл был удален «Файл удален до того, как мы его прочитаем». Однако я думаю, что это могло прерваться из-за ошибки «файл изменен при чтении», но я точно не знаю. Трудно сравнить архив с «оригиналом», так как у меня есть файлы кеша, которые приходят и уходят и т.

Обновление: при более внимательном рассмотрении «файл изменяется по мере его чтения» больше похоже на уведомление, похоже, tar продолжит работу, если файлы изменятся, пока tar выполняет свою работу. Но я оставлю ответ открытым, возможно, кто-то более опытный сможет добавить больше информации.

Ваше предположение верно: «Файл изменен при его чтении» - это уведомление, обычно связанное с используемыми файлами (т.е. записанными в процессе создания), когда tar создает архив. Если согласованность жизненно важна, вам лучше синхронизировать содержимое в другом месте, т.е.

rsync -avz /my/home/ /somebackupdir/my/home/  # initial sync, followed by 
rsync -avz /my/home/ /somebackupdir/my/home/  # any subsequent sync, repeated
                                              # as often as you feel necessary

Это дает вам преимущество наличия резервной копии, в которой нужно будет только обновить различия перед созданием архива.

Думаю, правильный ответ на ваш вопрос должен быть таким:

Использовать tar --warning=no-file-changed который подавляет только предупреждения "%s: file changed as we read it". Генерал --ignore-failed-read может игнорировать сбои, которые вы не хотели бы игнорировать.

Для сжатия нескольких файлов, пока пропуск любого отсутствующего файла:

# This file exists:
> existing_file 

# This file is missing:
rm -f deleted_file 

# Compress but don't fail if deleted_file is missing:
tar -cvzf archive.tar.gz $(ls deleted_file existing_file 2>/dev/null)
echo $? # exit code is 0

# List archive content:
tar tvf archive.tar.gz

  -rw-rw-r-- nmanos/nmanos     0 2020-05-06 10:00 existing_file