Автор | Сообщение |
Pirr![]()
36 сообщений |
#6650 2012-10-09 14:04 GMT+3 часа(ов) |
Здравствуйте!
Вот захотелось поиграться с Racket и использовать его как скриптовый язык для системного администрирования в Windows. Придумал первую задачу: необходимо в определенной директории найти архивы с бекапами имеющими формат backup_20121009.bak и оставить две наиболее свежие копии файлов а остальные удалить. И сразу уперся в проблему, какую функцию использовать для составления списка бекапов? directory-list или find-files? Как работает find-files так и не понял ![]() |
|
HiASM - это просто праздник какой-то!
|
|
Aoloa
37 сообщений |
#6651 2012-10-09 20:36 GMT+3 часа(ов) |
find-files смотрит во вложенных директориях, directory-list — только в одной.
find-files принимает два аргумента: фильтрующую функцию (принимает путь, возвращает #t или любое другое истинное значение, если его включать в результат, или #f, если не включать, и начальную директорию. Т.е. так: (find-files фильтрующая-функция директория). Помните, что \ в Схеме в строках надо удваивать — т.е. "C:\\мояпапка", а не "C:\мояпапка". Вот пример использования: (define (path-is-backup? p) Здесь функция is-path-backup? возвращает истинное значение, если файл — бэкап. (Вы, наверное, знаете про регулярные выражения. Если нет, то вкратце: функция is-path-backup? проверяет, что путь заканчивается (символ $; иначе было бы «если содержит») на \backup_###.bak или /backup_###.bak, где ### — одно или более (+) число от 0 до 9. Точка в регулярных выражениях имеет спец. значение, поэтому её надо экранировать с помощью \ (а \, в свою очередь, надо удваивать). directory-list принимает директорию и возвращает список файлов. Сама она не даёт возможности отфильтровать, но можно потом вызвать функцию filter. А ещё она возвращает не полный путь (D:\мояпапка\файл), а только имя файла. Вот пример использования directory-list, чтобы найти все файлы: (define (filename-is-backup? f) Вместо определения filename-is-backup? и path-is-backup? можно использовать (lambda ...): (filter (lambda (f) (regexp-match "^backup_[0-9]+\\.bak$" f)) |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
Pirr![]()
36 сообщений |
#6653 2012-10-10 00:57 GMT+3 часа(ов) |
Aoloa - спасибо огромное за развернутый ответ! Это то, что надо!
![]() |
|
HiASM - это просто праздник какой-то!
|
|
Aoloa
37 сообщений |
#6657 2012-10-11 15:19 GMT+3 часа(ов) |
Вы, наверное, уже поняли, что у меня тут ошибка и вместо
Цитата нужно Цитата |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
Pirr![]()
36 сообщений |
#6660 2012-10-11 22:14 GMT+3 часа(ов) |
Да я разобрался с этим, спасибо.
Вот возник следующий вопрос, как определить дату создания файлов? или лучше дату из имени файла выдрать? И если я получу дату, как их сравнивать? переводить в секунды или есть какие то функции для этого? |
|
HiASM - это просто праздник какой-то!
|
|
Aoloa
37 сообщений |
#6662 2012-10-12 20:31 GMT+3 часа(ов) |
Есть функция file-or-directory-modify-seconds. Но она возвращает время последнего изменения (в секундах, прошедших с 1 января 1970 года по Гринвичу), а не время создания. Как узнать время создания — не знаю. (Если честно, я с Racket’ом на Вы, я больше Каву предпочитаю...)
Чтобы получить месяц, год и прочее, можно преобразовать кол-во секунд в дату с помощью seconds->date, а потом использовать функции для работы с типом date, такие как date-year, date-month и т.д. (seconds->date секунды) или (seconds->date секунды #f) вернёт время по Гринвичу, (seconds->date секунды #t) — в часовом поясе компьютера. Вот как узнать год последнего изменения файла: (date-year |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
Pirr![]()
36 сообщений |
#6666 2012-10-14 16:13 GMT+3 часа(ов) |
Ммм..да... похоже я для своей задачи неправильно инструмент (Racket) выбрал. Конечно на PowerShell эта задача в пару строк решается, но я как то делал нечто подобное на NewLisp и там все нужные функции были в наличии, вот и подумал, что в Racket они тоже есть.
|
|
HiASM - это просто праздник какой-то!
|
|
misha![]()
1275 сообщений |
#6681 2012-10-22 20:08 GMT+3 часа(ов) |
ЦитатаВам нужно сравнивать не дату создания, а время последней модификации файлов. ЦитатаВ данном случае это будут целые числа. ЦитатаЭто узко специализированный инструмент. ЦитатаКонечно же Racket обладает всем необходимым функционалом. |
|
Aoloa
37 сообщений |
#6684 2012-10-22 21:58 GMT+3 часа(ов) |
Цитата Очевидно, что любой Тьюринг-полный язык обладает всем необходимым функционалом. Вот только некоторые вещи на одних языках делаются проще, чем другие. И если человеку нужны метаданные, доступные только в Windows, — глупо использовать кросплатформенный инструмент. Кросплатформенность не только помогает, но и мешает. |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|
|
misha![]()
1275 сообщений |
#6686 2012-10-23 21:46 GMT+3 часа(ов) |
ЦитатаЯ не понял вашего юмора. ЦитатаА что мешает использовать ffi? |
|
Aoloa
37 сообщений |
#6692 2012-10-24 21:22 GMT+3 часа(ов) |
ЦитатаЦитатаЯ не понял вашего юмора. Любую задачу можно решить на любом языке программирования. Вопрос только в трудозатратах. Цитата Ничто не мешает. Но зачем использовать FFI, если можно использовать другой инструмент, где можно обойтись без FFI? Если человеку нужны функции Windows и не нужна гибкость Racket’а — значит, он действительно неправильно выбрал язык и PowerShell или что-нибудь другое ему подойдёт лучше. |
|
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)
|