
Мне нужно скопировать файлы журналов базы данных между двумя серверами 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