Преобразовать время изменения из статистики в метку времени
Я только начал свой путь в bash-скриптинге и написал небольшой скрипт, который копирует определенные файлы на мою флешку и внешний жесткий диск в качестве резервной копии. Пока он копирует весь каталог со всеми файлами, включая те, которые я не изменял, что, естественно, занимает довольно много времени. Чтобы это изменить, я хочу сравнить два файла (на компьютере и на USB-накопителе) с тем временем, когда они были изменены. Так что теперь мне интересно, как я могу преобразовать вывод из
stat -c% y /test_folder/test.txt
в формат "YmDHMS"? Или, может быть, кто-то знает лучший способ сравнить файлы.
2 ответа
Для сравнения вам, вероятно, лучше использовать секунды, начиная с эпохи (т.е. stat -a %Y
) напрямую или даже проще использовать один из встроенных файловых тестов bash [[ FILE1 -nt FILE2 ]]
или же [[ FILE1 -ot FILE2 ]]
вместо:
file1 -nt file2
True if file1 is newer (according to modification date) than
file2, or if file1 exists and file2 does not.
file1 -ot file2
True if file1 is older than file2, or if file2 exists and file1
does not.
Однако, поскольку заданный вопрос касается конверсии, поскольку %y
время модификации, если у вас последняя версия GNU date
Вы могли бы обмануть и использовать это вместо этого. От man date
:
-r, --reference=FILE
display the last modification time of FILE
Так
$ date +%Y%m%d%H%M%S -r file
20170111075620
В качестве альтернативы, вы можете передать секунды с тех пор stat
в date
:
$ date +%Y%m%d%H%M%S -d "@$(stat -c '%Y' file)"
20170111075620
Для сравнения времени изменения (или доступа, или изменения inode) файлов вы должны использовать секунды с начала эпохи, это легче обрабатывать в сравнениях. stat
"s -c
вариант имеет %Y
спецификатор формата для получения времени модификации в секундах с начала эпохи.
Чтобы сравнить два файла по времени модификации, вы можете написать небольшую функцию:
chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" \
|| echo "$2 is newer" ;}
Введите два входных файла в качестве первого и второго позиционных параметров, и функция выведет, какой из них является более новым; когда они имеют одинаковое время модификации, выходные данные не будут показаны.
Пример:
$ chk_mod () { (( $(stat -c '%Y' "$1") > $(stat -c '%Y' "$2") )) && echo "$1 is newer" || echo "$2 is newer" ;}
$ chk_mod foobar spamegg
spamegg is newer