В зависимости от метода, который используется для резервного копирования файлов, измененная или измененная дата должна отражать время, когда они были скопированы — например, если вы использовали cp -p для их резервного копирования, измененная дата не изменится, но измененная дата будет отражать время копирования.
Вы можете получить эту информацию с помощью команды stat
:
stat <filename>
который вернет следующее (вместе с другой информацией, связанной с файлом, не показанной):
Access: 2016-05-28 20:35:03.153214170 -0400
Modify: 2016-05-28 20:34:59.456122913 -0400
Change: 2016-05-29 01:39:52.070336376 -0400
Этот вывод из файла, который я скопировал с помощью cp -p во время, показанное как «изменение».
Вы можете получить только время изменения, вызвав stat в указанном формате:
stat -c '%z' <filename>
2016-05-29 01:39:56.037433640 -0400
или с большой буквы Z для этого времени в секундах с начала эпохи. Вы можете комбинировать это с командой даты, чтобы вытащить только дату (или использовать grep и т. д.)
date -d "`stat -c '%z' <filename>" -I
2016-05-29
Команду find
можно использовать для поиска файлов по временным рамкам, в данном случае с использованием флагов -cmin
«измененные минуты», -mmin
«измененные минуты» или, что маловероятно, -amin
«доступные минуты». Последовательность команд для получения минут с полуночи немного уродлива, но она работает.
Мы должны найти аргумент «минуты с момента последнего изменения файла» (или изменения, если этот критерий работает). Итак, сначала вы должны посчитать минуты с полуночи, а затем запустить find.
min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc)
Немного развернуть это:
$(date +%s)
== секунд с начала эпохи до «сейчас»
"(date -I) 0"
== текущая дата в формате "ГГГГ-ММ-ДД 0", где 0 указывает на 0 секунд в день
$(date -d "(date -I 0" +%s))
== секунд от эпохи до сегодняшней полуночи
- Затем мы (эффективно) повторяем ( $now - $midnight ) / 60 в bc, чтобы преобразовать результаты в минуты.
Вызов поиска передается в минутах, прошедших с полуночи, с начальным «-», указывающим до X минут назад. Знак «+» указывает на X минут или более назад.
find /path/to/base/folder -cmin -"$min_since_mid"
Фактический ответ
Наконец, чтобы создать tgz-архив файлов в данном каталоге (и подкаталогах), которые были изменены с полуночи сегодня, используйте эти две команды:
min_since_mid=$(echo $(( $(date +%s) - $(date -d "(date -I) 0" +%s) )) / 60 | bc)
find /path/to/base/folder -cmin -"${min_since_mid:-0}" -print0 -exec tar czvf /path/to/new/tarball.tgz {} +
Аргумент -print0 для поиска сообщает, что файлы должны быть разделены нулевой строкой, что, среди прочего, предотвратит проблемы с пробелами в именах.
Единственное, в чем я не уверен, так это в том, что вы должны использовать измененное время (-cmin), измененное время (-mmin) или время доступа (-amin). Взгляните на свои файлы резервных копий и посмотрите, какое поле точно отражает дату/время резервной копии - я бы подумал, что изменилось время, но я не уверен.
Обновление: изменено -"$min_since_mid"
на -"${min_since_mid:-0}", так что если min_since_mid не установлено, вы не получите ошибку с недопустимым аргументом - вы просто не получите никаких результатов. Вы также можете окружить поиск оператором if, чтобы заблокировать вызов, если эта переменная не установлена должным образом.
person
Argonauts
schedule
29.05.2016