ディレクトリ内のすべてのファイルを再帰的に処理する


Tag: 入出力

  1. 処理系がワイルドカード文字をどう扱うか
  2. OSの種類
  3. OSがワイルドカード文字をどう扱うか

等々の組み合わせ状況により結果が変わってくる可能性がありますが、CLのパス名には、任意の数のディレクトリにマッチさせる"**"という表現がありますので、directoryでディレクトリ内のファイルにマッチさせ、それをマップ関数等で処理することができます。

;; /home/CLer/lisp/以下の *.*~にマッチするすべてのファイル
(length
 (directory "/home/CLer/lisp/**/*.*~"))
;=> 1234(サンプル結果)
;; パス名を印字
(map nil 
     #'print
     (directory "/home/CLer/lisp/**/*.*"))
;-> #P"/home/CLer/lisp/Scratch/scm-2007-01-21.scm.~1~"
;   #P"/home/CLer/lisp/bolio/bolio.lisp
;   #P"/home/CLer/lisp/bolio/bolio.lisp.~2~"
;   #P"/home/CLer/lisp/bolio/cadr.lisp
;   #P"/home/CLer/lisp/bolio/common.lisp.~1~"
;   #P"/home/CLer/lisp/bolio/common.lisp.~2~"
;   #P"/home/CLer/lisp/bolio/common.lisp.~3~"
;   #P"/home/CLer/lisp/bolio/lmm-settings.lisp.~1~"
;   #P"/home/CLer/lisp/cl-2007-01-19.lisp
;   #P"/home/CLer/lisp/cl-2007-01-20.lisp.~1~"
;....
;=> NIL

また、処理系/OSの差を吸収することを目的としたコンパチブルレイヤのパッケージとしては、CLiki:CL-FADがありますので、このようなものを利用することで可搬性が高められるかもしれません。

(cl-fad:walk-directory "/home/CLer/lisp/" #'print)
;-> #P"/home/CLer/lisp/Scratch/scm-2007-01-21.scm.~1~"
;   #P"/home/CLer/lisp/bolio/bolio.lisp
;   #P"/home/CLer/lisp/bolio/bolio.lisp.~2~"
;   #P"/home/CLer/lisp/bolio/cadr.lisp
;   #P"/home/CLer/lisp/bolio/common.lisp.~1~"
;   #P"/home/CLer/lisp/bolio/common.lisp.~2~"
;   #P"/home/CLer/lisp/bolio/common.lisp.~3~"
;   #P"/home/CLer/lisp/bolio/lmm-settings.lisp.~1~"
;   #P"/home/CLer/lisp/cl-2007-01-19.lisp
;   #P"/home/CLer/lisp/cl-2007-01-20.lisp.~1~"
;....
;=> NIL

参考

議論