Clojure - 是否可以在doseq语句中增加变量?

Yec*_*kiy 3 clojure

我试图迭代给定目录中的文件列表,并将一个递增变量i = {1,2,3 .....}添加到它们的名称中.

这是我用于迭代文件和更改每个文件名称的代码:

(defn addCounterToExtIn [d]
  (def i 0)
  (doseq [f (.listFiles (file d)) ] ; make a sequence of all files in d
    (if (and (not (.isDirectory f)) ; if file is not a directry and
             (= '(\. \i \n) (take-last 3 (.getName f))) ) ; if it ends with .in
      (fs/rename f (str d '/ i (.getName f)))))) ; add i to start of its name
Run Code Online (Sandbox Code Playgroud)

我不知道我怎么可以增加idoseq通过每个文件进行迭代.或者,是否有更好的循环用于实现所需的结果?

edb*_*ond 8

使用file-seqmap-indexed:

(require '[clojure.java.io :as io])

(dorun
  (->>
    (file-seq (io/file "/home/eduard/Downloads"))
    (filter #(re-find #".+\.pdf$" (.getName %)))
    (map-indexed (fn [i v] [i v]))))
Run Code Online (Sandbox Code Playgroud)

更改功能map-indexed以重命名,您就完成了.pdf文件的示例输出:

([0 #<File /home/eduard/Downloads/some.pdf>] ...)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,file-seq是递归的,并且还将返回子目录中的文件. (3认同)