Как заархивировать/сжать файлы, которые находятся между определенными днями?

Как заархивировать/сжать файлы, которые находятся между определенными днями?

Мне нужно скопировать файлы журналов базы данных между двумя серверами SUSE, где меня интересуют файлы ТОЛЬКО в период с 10.3.2013 по 13.3.2013.

Перед копированием желательно сжать файлы, поэтому я их tar и scp. В настоящее время я использую, tar -cvzf /tmp/saas_archive_logs.tar.gz /var/lib/edumate/backup/archive_logs/db2inst1/SAAS --newer-mtime=2013-03-10что дает мне все файлы с 10.3.2013 по настоящее время. Но мне не нужны все из них. И я не нашел никакого tar-ключа.

решение1

Как указал Бичой, вы можете использовать findкоманду для поиска файлов с определенным временем доступа, создания и изменения. Однако -mtime принимает смещение с шагом в 24 часа и не всегда удобно для расчета, если только вы не хотите что-то из определенного количества чисел «дней» назад. Вам нужно будет объединить это с , -daystartчтобы «округлить» это до начала дня.

Я думаю, что в вашем случае более удобным будет параметр -newermt, который принимает строку даты (а не имя справочного файла, как большинство версий -newerXY)

Объедините это с findопцией -print0обработки файлов с пробелами в имени и, при желании, -type fне извлекайте никакие каталоги за интересующий вас период:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | xargs -0 tar -cvzf /tmp/saas_archive_logs.tar.gz 

С этим есть одна большая проблема: если количество найденных файлов становится слишком большим, xargsбудет вызывать свою команду (в данном случае tar) несколько раз, чтобы xargsвместить аргументы в командной строке, которые не бесконечны. Чтобы обойти это, я всегда использую cpio, который считывает имена файлов из stdin. С --format=ustarпараметром для получения tar-файла POSIX, и в вашем случае вам нужно будет передать вывод, gzipчтобы получить желаемый результат:

find /var/lib/edumate/backup/archive_logs/db2inst1/SAAS \
   -newermt 20130310 -not -newermt 20130314 -type f -print0 \
   | cpio --create --null  --format=ustar \
   | gzip > /tmp/saas_archive_logs.tar.gz

решение2

Вы можете проверить findкоманду, чтобы получить список файлов, которые необходимо тарировать. Вы можете указать начальную и конечную дату (с точностью до секунд), используя обычные аргументы -atime, -btime, -mtime... в сочетании с -notаргументом . Затем вы можете передать вывод в , xargsа затем в tar. Проверьте страницу руководства findдля получения подробной информации об аргументах времени.

Обновлять: Как предложил Энтон, вы можете использовать модификаторы +/- с -mtimeдля указания периода без использования -not. Вот пример:

find . -mtime -5d2h3m10s -mtime +4d0h15m20s -print0 | xargs -0 tar cjvf mytar.tar.bz2

Где d, h, m, sсоответствуетдни, часы, минутыисекундысоответственно. Это даст файлы, измененные новее 5d2h3m10sи старше, чем4d0h15m20s

Связанный контент