Clojure で次のディレクトリ構造を作成する必要があるとします。
a
\--b
| \--b1
| \--b2
\--c
\-c1
次のような手続き的なことを行う代わりに:
(def a (File. "a"))
(.mkdir a)
(def b (File. a "b"))
(.mkdir b)
;; ...
...上記のアクションをデータとして宣言的に表現し、階層を一気に作成する賢い方法はありますか?
Clojure で次のディレクトリ構造を作成する必要があるとします。
a
\--b
| \--b1
| \--b2
\--c
\-c1
次のような手続き的なことを行う代わりに:
(def a (File. "a"))
(.mkdir a)
(def b (File. a "b"))
(.mkdir b)
;; ...
...上記のアクションをデータとして宣言的に表現し、階層を一気に作成する賢い方法はありますか?
迅速かつ簡単な方法は、ディレクトリのベクトルを作成して mkdir を作成し、それにマップすることです。
user> (map #(.mkdir (java.io.File. %)) ["a", "a/b" "a/b/c"])
(true true true)
または、ディレクトリ構造をツリーとして指定し、ジッパーを使用してそれを歩き、途中でディレクトリを作成することもできます。
(def dirs ["a" ["b" ["b1" "b2"]] ["c" ["c1"]]])
(defn make-dir-tree [original]
(loop [loc (zip/vector-zip original)]
(if (zip/end? loc)
(zip/root loc)
(recur (zip/next
(do (if (not (vector? (zip/node loc)))
(let [path (apply str (interpose "/" (butlast (map first (zip/path loc)))))
name (zip/node loc)]
(if (empty? path)
(.mkdir (java.io.File. name))
(.mkdir (java.io.File. (str path "/" name))))))
loc))))))
(make-dir-tree dirs)
.
arthur@a:~/hello$ find a
a
a/c
a/c/c1
a/b
a/b/c
a/b/b2
a/b/b1
一般的なシステム管理を頻繁に行っている場合は、もっと重いものが必要になるかもしれません。パレット プロジェクトは、物理システムおよびクラウド ホスト システムであらゆる種類のシステム管理を行うためのライブラリです (ただし、クラウドに傾倒する傾向があります)。具体的にはディレクトリ