どう書く?org 指定されたフォルダ以下のゴミ掃除 を commonlispで
どう書く.orgのお題をやってみる。
まずは「指定されたフォルダ以下のゴミ掃除」なんだけど、いきなりディレクトリの一覧のしかたがわからん。
調べる・・・。
directoryでとれるみたい。
・・・pathnameの使いかたがよくわからんぞ。
googleに聞いてみてもあんまり使い方書いてない。困った。
ディレクトリをあれこれするときはcl-fadを使うのが一般的?みたい。
しかしpathname使いにくいな。つかいにくいぞ。
結局fadは使わないことにした。でも中のロジックは参考にさせてもらった。
結構時間かかったなぁ。やっぱり文法よりもライブラリ(っていうのか?)の使いかた調べるのに時間がかかるね。
試行錯誤の後もそのまま載せておく。
こんな感じ。
;;指定されたフォルダ以下のゴミ掃除 (defun cleanup-dir (path) (let ((targets (get-directory-and-files (pathname path)))) (if (null targets) nil (mapc #'(lambda (target) (let ((name (or (pathname-type target) (pathname-name target)))) (cond ((null name) (print (concatenate 'string name " is dir"))) ((char= #\~ (char name (1- (length name)))) (print (concatenate 'string name " delete")) (delete-file target))))) targets)))) (defun get-directory-and-files(path) (concatenate 'list (directory (merge-pathnames path "*")) (directory (merge-pathnames path "*.*")))) ;; (print (concatenate 'string "search delete files " path)) ;; (setf names (directory (concatenate 'string path "*"))) ;; (print names) ;; (mapcar #'(lambda (target) ;; (let ((name (or ;; (pathname-type target) ;; (pathname-name target)))) ;; (print (concatenate 'string "check file " name)) ;; (cond ((null name) ;; (cleanup-dir (namestring target))) ;; ((char= #\~ (char name (1- (length name)))) ;; (print (concatenate 'string "delete " name)) ;; (delete-file target))))) ;; ;;(print target) ;; ;;(print (pathname-type target)) ;; ;;(print (pathname-name target)) ;; ;; (let ((name (or (pathname-type target) ;; ;; (pathname-name target))) ;; ;; (print name)))) ;; ;; (if (char= #\' (char target (1- (length target)))) ;; ;; (print p))))) ;; names))