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

Команда оболочки для фильтрации несуществующих файлов в конвейере

Я ищу хороший способ создать резервную копию tar.gz того, что будет переопределено извлечением другого tar.gz.

tar -ztf patch.tar.gz | grep -v "/$" | tar -T- -zcvf backup.tar.gz

Это прекрасно работает! Однако иногда новый патч (patch.tar.gz) не только содержит файлы, уже существующие на жестком диске, но также может добавлять новые файлы, которых еще нет. Эти несуществующие файлы невозможно будет создать резервную копию, и второй tar выдаст ошибку. Код выхода: 2.

tar: folder / file.txt: Cannot stat: Нет такого файла или каталога
tar: выход со статусом сбоя из-за предыдущей ошибки

Я ищу команду оболочки, которая проверяет только наличие файла (stdin) и отправляет существующие файлы на stdout. Он существует? Мне понадобится что-то вроде этого:

tar -ztf patch.tar.gz | grep -v "/$" | filterfileexist | tar -T- -zcvf backup.tar.gz

Мне нужна одна команда оболочки, а не сценарий оболочки.
Очевидно, я мог бы сам реализовать эту команду оболочки на C, потому что это очень просто, но я надеюсь найти что-то общее, что будет найдено на других платформах UNIX.

Вот пара альтернатив.

tar -ztf patch.tar.gz | grep -v "/ $" | xargs -i sh -c 'test -f {} && echo {}' | tar -T- -zcvf backup.tar.gz

или

tar -ztf patch.tar.gz | grep -v "/ $" | tar --ignore-failed-read -T- -zcvf backup.tar.gz

Второй пример завершится с нулевым статусом после попытки резервного копирования несуществующего файла (проверено на Centos 6.5), что позволяет избежать проблемы.

Попробуйте использовать для этого perl one liner

лайк

cat filelist | perl -ne 'chomp(); if (-e $_) {print "$_\n"}' | tar -T- -zcvf backup.tar.gz