« ^ »

GNU Guileでファイル及びディレクトリ操作

所要時間: 約 1分

ファイルシステムに関連するファイル及びディレクトリの操作はftwモジュールに実装されている。 ftwモジュールをインポートしておく。

(use-modules (ice-9 match)
             (ice-9 ftw))

ディレクトリ作成

mkdir関数はディレクトリを作成する。

(mkdir "foo")

ファイル一覧の取得

scandir関数は引数に渡したディレクトリパス内のファイル及びディレクトリの一覧を返す。

(scandir ".")

ファイルの移動

rename-file関数はファイルやディレクトリの名前を変更する。

(rename-file "foo" "bar")

再帰的にディレクトリを探索する

再帰的にディレクトリを処理するにはfile-sysmte-tree関数を用いる方法がある。 例えば再帰的にファイル名のみを抽出するには次のようにすることができる。

(define remove-stat
  (match-lambda
   ((name stat)              ; flat file
    name)
   ((name stat children ...) ; directory
     (list name (map remove-stat children)))))

(remove-stat (file-system-tree "/ng/symdon/pages/posts/1610809730/"))

このコードはGNU Guileの公式ドキュメントで紹介されている。 file-system-tree関数はディレクトリに含まれるファイルと情報がツリー構造になっているペアを返す。 それらからファイル名のみを抽出するremove-stat関数を定義してそれを用いて処理できる。

REPL上で評価すると次のようになる。

scheme@(guile-user) [57]> (remove-stat (file-system-tree "/ng/symdon/pages/posts/1610809730/"))
$46 = ("1610809730/" (("foo" (("bar" (("baz" ("CCC")) "BBB")) "AAA")) "foo.scm" ".#foo.s