Исключить каталог из архива
tar --exclude='data/logs' -czf arch.tgz data
Нюанс:
--exclude обязан стоять до источника. Поставил после — tar честно предупредил --exclude 'data/logs' has no effect и всё равно упаковал логи. Второе: шаблон сравнивается с тем, как путь записан внутри архива. Упаковываете data, значит исключать надо data/logs, а не /tmp/ta/data/logs — с абсолютным путём совпадения не будет.Достать один файл из архива
tar -tf arch.tar | grep app.conf
tar -xf arch.tar tmp/ta/data/conf/app.conf
Нюанс: при упаковке по абсолютному пути tar срезает ведущий слеш и пишет
Removing leading '/' from member names. Поэтому распаковать по тому же абсолютному пути не выйдет — получите Not found in archive. Сначала посмотрите список через -t, потом копируйте путь оттуда.Дописать или удалить файл в архиве
tar -rf arch.tar newfile.txt
tar --delete -f arch.tar oldfile.txt
Нюанс: только для несжатых архивов. На
.tgz обе команды падают с Cannot update compressed archives и Error is not recoverable: exiting now. Чтобы поправить сжатый архив, его придётся распаковать целиком.Сжать быстрее и плотнее gzip
tar --zstd -cf arch.tar.zst data
На моих тестовых данных zstd дал 199 байт против 225 у gzip. Нюанс: если пакета
zstd в системе нет, tar создаст файл нулевого размера и завершится с кодом 2. Файл при этом лежит на месте и выглядит как архив — в скрипте бэкапа такое заметят не сразу. Проверяйте код возврата, а не наличие файла.Не перезаписать свежие файлы при распаковке
tar -xf arch.tar --keep-newer-files
Работает: файл, который новее архивного, остаётся нетронутым, в выводе
Current 'data/logs/a.log' is newer or same age. Нюанс: код возврата при этом 2, как при ошибке. Под set -e скрипт упадёт, хотя всё прошло по плану.Про сравнение архива с диском:
tar -df arch.tar показывает Mod time differs и Size differs по каждому расхождению. Удобно проверить бэкап, не распаковывая.А вы чем сжимаете бэкапы — gzip по привычке или уже переехали на zstd?
#Linux #tar #Backup #Bash #DevOps