У меня есть резервная команда, которая выглядит так:
tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/ --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1
Проблема в том, что он также включает пустую папку, когда все файлы в них не изменяются, поэтому не включены в инкрементальную резервную копию. Я ищу способ избежать этого, но единственные решения, которые я нашел (передача результатов find в tar в качестве аргументов с помощью xargs), работают только когда у вас одна папка, а у меня их три.
решение1
По умолчанию tar не предоставляет возможности пропускать пустые каталоги. При этом не так уж и много работы — вытащить из воздуха простой скрипт оболочки, чтобы сделать то, что нужно.
Здесь— это обсуждение на форуме, где я нашел решение точно такой же проблемы, когда возникла такая необходимость.
ГЛАВНОЕ ОБНОВЛЕНИЕ: Сначала мне нужно серьезно извиниться за мой неаккуратный копипаст. Это был пост поздно ночью, и я был не на пике интеллекта...
Правильный пост на форуме:здесь. На самом деле это тот же человек, который задает тот же вопрос на другом форуме и получает совершенно другой ответ. Я добавил оба в закладки, когда столкнулся с проблемой, и дал ссылку не на тот.
На самом деле, здесь показано, как "перенаправить" вывод команды find в tar. Вам придется игнорировать все эти "новее, чем", о которых спрашивает парень.
Вместо этого нужная вам часть поиска выглядит так:
find . -type d ! -empty | ...
Конечно, вам нужно заменить точку (".") на путь, где вам нужно запустить find/tar. После символа трубы продолжайте с командой tar согласно второй ссылке (правильной).
Еще раз приношу свои глубочайшие извинения, если я доставил кому-то неприятности из-за своей невнимательности к деталям.
решение2
Другой способ, который работает только в том случае, если у вас изменен лишь небольшой набор файлов:
tar cvzf [...] `find . -mtime -1 -type f`
Если у вас большой набор изменений, вы можете сохранить список измененных файлов в файл и использовать параметр --files-from в команде tar:
find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt
или в одну строку
find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin