ワイルドカードを展開したパスにする


/tmp/foo/bar/baz/quux.txt というファイルが存在し、このファイル(および近隣ファイル)をワイルドカード指定したい場合、下記のようにパスを作成することが可能でしょう。

(make-pathname :name "quux" :type "txt" :directory '(:absolute "tmp" "foo" :wild-inferiors "baz"))
→ #P"/tmp/foo/**/baz/quux.txt"

しかし、ワイルドカードを含んだパス名を open等の入出力関数に渡すことはできませんので展開して渡す必要があります。

directory はワイルドカードを処理可能ですので、可搬的には下記のように書くことが可能でしょう。

(defun glob (path)
  (if (wild-pathname-p path)
      (car (directory path))
      path))

(glob (make-pathname :name "quux" :type "txt" :directory '(:absolute "tmp" "foo" :wild-inferiors "baz")))
→ #P"/private/tmp/foo/bar/baz/quux.txt"

議論