Как scp / tar файлы, которые находятся между определенными днями?
8
Мне нужно скопировать файлы журнала базы данных между двумя серверами 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 до сих пор. Но мне не нужны все из них. И я не нашел смолу.
Как отметил Бичой, вы можете использовать findкоманду для поиска файлов с определенным временем доступа, создания и изменения. Однако -mtime принимает смещение с шагом 24 часа и не всегда удобно вычислять, если вы не хотите что-то из определенного количества чисел «дней» назад. Вам нужно будет объединить это с -daystart«округлить» это к началу дня.
Я думаю, что более удобным в вашем случае является параметр -newermt, который принимает строку даты (а не имя справочного файла, как в большинстве версий -newerXY)
Объедините это с опцией find's -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, который читает имена файлов из стандартного ввода. С --format=ustarпараметром для получения tar-файла POSIX, и в вашем случае вам понадобится передать вывод, gzipчтобы получить желаемый результат:
Могу ли я указать часы и минуты при использовании вашего кода?
Радек
Я пытался до публикации своего комментария, но ... "найти: я не могу понять, как интерпретировать` 201302050000 'как дату или время "
Радек
@Radek Короткий ответ - Да. Я бы использовал YYYYMMDDThhmm, чтобы не иметь дело с пробелами. Длинный ответ: man find скажет вам: спецификации времени интерпретируются как аргумент для опции -d даты GNU и с датой, которую вы найдете... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
Anthon
@Radek спасибо за указание на ошибку, так как я не мог редактировать свой комментарий, я Tвставил новый с вставкой между днями и часами. Это я проверял и работает. Почему-то findне знает, как иначе разбить строку (возможно, потому что это может быть ГГММДДччммсс вместо ГГГГММДДччмм. Я думал, что для даты потребуется точка для секунд ( .ss), но это, вероятно, только для ее установки.
Anthon
4
Вы можете проверить findкоманду, чтобы получить список файлов, которые необходимо тарировать. Вы можете указать начальную и конечную дату (до секунд точности) , используя нормальные -atime, -btime, -mtime... аргументы в сочетании с -notаргументом. Затем вы можете направить вывод в, xargsа затем в tar. Проверьте man-страницу findдля деталей о временных аргументах.
Обновление:
как предложил Anthon, вы можете использовать +/- модификаторы с, -mtimeчтобы указать период без использования -not. Вот пример:
Аргумент -mtimeдолжен быть смещением в днях, которое не всегда, если только это смещение не зафиксировано между временами выполнения. Вы также можете использовать -mtime +Xи -mtime -Xдля указания до и после X дней назад вместо использования -not.
Anthon
Какой будет синтаксис для указания абсолютной даты и времени?
... a mostly free format human readable date string ..... A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers
T
вставил новый с вставкой между днями и часами. Это я проверял и работает. Почему-тоfind
не знает, как иначе разбить строку (возможно, потому что это может быть ГГММДДччммсс вместо ГГГГММДДччмм. Я думал, что для даты потребуется точка для секунд (.ss
), но это, вероятно, только для ее установки.Вы можете проверить
find
команду, чтобы получить список файлов, которые необходимо тарировать. Вы можете указать начальную и конечную дату (до секунд точности) , используя нормальные-atime
,-btime
,-mtime
... аргументы в сочетании с-not
аргументом. Затем вы можете направить вывод в,xargs
а затем вtar
. Проверьте man-страницуfind
для деталей о временных аргументах.Обновление: как предложил Anthon, вы можете использовать +/- модификаторы с,
-mtime
чтобы указать период без использования-not
. Вот пример:Где
d, h, m, s
соответствует дням, часам, минутам и секундам соответственно. Это даст файлы, измененные новее5d2h3m10s
и старше, чем4d0h15m20s
источник
-mtime
должен быть смещением в днях, которое не всегда, если только это смещение не зафиксировано между временами выполнения. Вы также можете использовать-mtime +X
и-mtime -X
для указания до и после X дней назад вместо использования -not.