> 1 <

Автор Сообщение

Pirr

Members


Статус

36 сообщений
http://hiasm.com
Где: Russia
Род занятий:
Возраст:

#6650   2012-10-09 14:04 GMT+3 часа(ов)      
Здравствуйте!
Вот захотелось поиграться с Racket и использовать его как скриптовый язык для системного администрирования в Windows.
Придумал первую задачу: необходимо в определенной директории найти архивы с бекапами имеющими формат backup_20121009.bak и оставить две наиболее свежие копии файлов а остальные удалить.
И сразу уперся в проблему, какую функцию использовать для составления списка бекапов? directory-list или find-files?
Как работает find-files так и не понял Может кто нибудь показать пример с функцией find-files?
HiASM - это просто праздник какой-то!

Aoloa

Members


Статус

37 сообщений

Где: Ukraine
Род занятий:
Возраст:

#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)
(regexp-match "[\\/]backup_[0-9]+\\.bak$" p))
(find-files (path-is-backup? p) "D:\\мояпапка")

Здесь функция is-path-backup? возвращает истинное значение, если файл — бэкап. (Вы, наверное, знаете про регулярные выражения. Если нет, то вкратце: функция is-path-backup? проверяет, что путь заканчивается (символ $; иначе было бы «если содержит») на \backup_###.bak или /backup_###.bak, где ### — одно или более (+) число от 0 до 9. Точка в регулярных выражениях имеет спец. значение, поэтому её надо экранировать с помощью \ (а \, в свою очередь, надо удваивать).


directory-list принимает директорию и возвращает список файлов. Сама она не даёт возможности отфильтровать, но можно потом вызвать функцию filter. А ещё она возвращает не полный путь (D:\мояпапка\файл), а только имя файла.
Вот пример использования directory-list, чтобы найти все файлы:
(define (filename-is-backup? f)
(regexp-match "^backup_[0-9]+\\.bak$" f))
(filter filename-is-backup? (directory-list "D:\\мояпапка"))


Вместо определения filename-is-backup? и path-is-backup? можно использовать (lambda ...):
(filter (lambda (f) (regexp-match "^backup_[0-9]+\\.bak$" f))
(directory-list "D:\\t"))
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Pirr

Members


Статус

36 сообщений
http://hiasm.com
Где: Russia
Род занятий:
Возраст:

#6653   2012-10-10 00:57 GMT+3 часа(ов)      
Aoloa - спасибо огромное за развернутый ответ! Это то, что надо!
HiASM - это просто праздник какой-то!

Aoloa

Members


Статус

37 сообщений

Где: Ukraine
Род занятий:
Возраст:

#6657   2012-10-11 15:19 GMT+3 часа(ов)      
Вы, наверное, уже поняли, что у меня тут ошибка и вместо
Цитата
(find-files (path-is-backup? p) "D:\\мояпапка")

нужно
Цитата
(find-files path-is-backup? "D:\\мояпапка")
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Pirr

Members


Статус

36 сообщений
http://hiasm.com
Где: Russia
Род занятий:
Возраст:

#6660   2012-10-11 22:14 GMT+3 часа(ов)      
Да я разобрался с этим, спасибо.
Вот возник следующий вопрос, как определить дату создания файлов? или лучше дату из имени файла выдрать?
И если я получу дату, как их сравнивать? переводить в секунды или есть какие то функции для этого?
HiASM - это просто праздник какой-то!

Aoloa

Members


Статус

37 сообщений

Где: Ukraine
Род занятий:
Возраст:

#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
(seconds->date
(file-or-directory-modify-seconds "C:\\Work\\aa.html")))
With iTeX* your entire life can be encapsulated into a dynamic hyperdocument, downloadable by anybody you designate (Donald E. Knuth, An Earthshaking Announcement)

Pirr

Members


Статус

36 сообщений
http://hiasm.com
Где: Russia
Род занятий:
Возраст:

#6666   2012-10-14 16:13 GMT+3 часа(ов)      
Ммм..да... похоже я для своей задачи неправильно инструмент (Racket) выбрал. Конечно на PowerShell эта задача в пару строк решается, но я как то делал нечто подобное на NewLisp и там все нужные функции были в наличии, вот и подумал, что в Racket они тоже есть.
HiASM - это просто праздник какой-то!

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6681   2012-10-22 20:08 GMT+3 часа(ов)      
Цитата
Вот возник следующий вопрос, как определить дату создания файлов? или лучше дату из имени файла выдрать?
Вам нужно сравнивать не дату создания, а время последней модификации файлов.
Цитата
И если я получу дату, как их сравнивать? переводить в секунды или есть какие то функции для этого?
В данном случае это будут целые числа.
Цитата
Конечно на PowerShell эта задача в пару строк решается
Это узко специализированный инструмент.
Цитата
но я как то делал нечто подобное на NewLisp и там все нужные функции были в наличии, вот и подумал, что в Racket они тоже есть.
Конечно же Racket обладает всем необходимым функционалом.

Aoloa

Members


Статус

37 сообщений

Где: Ukraine
Род занятий:
Возраст:

#6684   2012-10-22 21:58 GMT+3 часа(ов)      
Цитата
Конечно же Racket обладает всем необходимым функционалом.

Очевидно, что любой Тьюринг-полный язык обладает всем необходимым функционалом.

Вот только некоторые вещи на одних языках делаются проще, чем другие.

И если человеку нужны метаданные, доступные только в 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

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6686   2012-10-23 21:46 GMT+3 часа(ов)      
Цитата
Очевидно, что любой Тьюринг-полный язык обладает всем необходимым функционалом.
Я не понял вашего юмора.
Цитата
И если человеку нужны метаданные, доступные только в Windows, — глупо использовать кросплатформенный инструмент. Кросплатформенность не только помогает, но и мешает.
А что мешает использовать ffi?

Aoloa

Members


Статус

37 сообщений

Где: Ukraine
Род занятий:
Возраст:

#6692   2012-10-24 21:22 GMT+3 часа(ов)      
Цитата
Цитата
Очевидно, что любой Тьюринг-полный язык обладает всем необходимым функционалом.
Я не понял вашего юмора.

Любую задачу можно решить на любом языке программирования. Вопрос только в трудозатратах.

Цитата
А что мешает использовать ffi?

Ничто не мешает. Но зачем использовать 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)
> 1 <


Онлайн :

1 пользователь(ей), 13 гость(ей) :
Hedin



Реклама на сайте: