Перейти к содержимому

Утилита Linux для «отметки времени»

2

Функция метки времени wget обеспечивает загрузку только тех файлов, которые были изменены. Я ищу инструмент командной строки linux, который будет рекурсивно сравнивать содержимое каталогов с сохраненной версией (с момента последнего запуска) и выполнять произвольную команду оболочки для любых новых или обновленных файлов. В принципе:

run-on-updated --directory /path/to/my/dir --last-results ~/.lastrun --exec "echo {}" 

Я мог даже представить это как расширение команды «найти». Существует ли такой инструмент?

546 просмотров
Nicholas White спросил 13 лет назад
N 113

2 ответа

3
Принятый ответ

Попытка ответить на вопрос - вероятно, с большим количеством возможностей для улучшения:

tar -cv -f /dev/null -g ~/.lastrun /path/to/my/dir | grep -ve '/$' | xargs -I{} echo '{}' 

Примечание для команды tar: «Параметр -g» указывает tar работать с инкрементным архивом с дополнительными метаданными, хранящимися в отдельном файле, называемом файлом моментального снимка. Цель этого файла - помочь определить, какие файлы были изменены, добавлено или удалено с момента последнего резервного копирования, поэтому в следующем инкрементном резервном копировании будут только измененные файлы. " (Цитата из документа)

Команда grepисключает имена каталогов (оканчивающиеся на /), которые tar всегда выводит, и, наконец xargs, запустит нужную команду для файлов.

Это работает! Он обновляет файл ~ / .lastrun на месте, что тоже полезно.

Nicholas White · 13 лет назад · 1

Рад, что это работает для вас. Пожалуйста, позаботьтесь, если есть какие-то имена файлов с пробелами (вчера я слишком устал, чтобы думать об этом;) Вы будете чувствовать себя более уверенно при использовании xargs -I {} echo '{}' - я соответственно отредактировал свой ответ.

mpy · 13 лет назад · 0
mpy ответил 13 лет назад
M 17 745
1

Я не уверен, что вы подразумеваете под предложением «сравнить содержимое каталогов с сохраненной версией», но чтобы сделать то, что делает ответ mpy, я бы предпочел find:

Прежде чем запускать findкоманду в первый раз, вам нужно выполнить touchкоманду: создайте файл метки времени:

touch .lastrun 

Позже выполните команду touch после выполнения поиска:

find my/dir -type f -newer .lastrun -exec echo '{}' \; touch .lastrun 

Файл .lastrunникогда не будет указан сам по себе, потому что он никогда не новее, чем он сам.

Volker Siegel ответил 9 лет назад
V 1 038