【问题标题】:Emacs lisp: How can I get the newest file in a directory?Emacs lisp:如何获取目录中的最新文件?
【发布时间】:2015-06-17 08:32:59
【问题描述】:

给定一个目录的路径,如何返回该目录中最新文件的路径?

【问题讨论】:

    标签: file emacs directory elisp


    【解决方案1】:

    使用内置API也可以实现:

    (defun latest-file (path)
      "Get latest file (including directory) in PATH."
      (car (directory-files path 'full nil #'file-newer-than-file-p)))
    
    (latest-file "~/.emacs.d") ;; => "/Users/xcy/.emacs.d/var"
    

    如果您还需要子目录下的文件,请使用directory-files-recursively 而不是directory-files。如果要排除目录,请先使用file-directory-p 过滤文件/目录列表。

    【讨论】:

    • 注意这个算法要求N*log(N)* disk accesses, where N`是目录中的文件数。
    • @sds 我已经更新了我的答案,直接使用directory-files 而不是自己排序。
    • file-newer-than-file-p 访问磁盘两次。
    • 我明白了,应该使用directory-files-and-attributes
    • 在 emacs 26.1 中,directory-files 的帮助声称指定第 4 个参数会导致未排序的列表,nil 或未指定按 string-lessp 排序。
    【解决方案2】:

    使用f:

    (defun aj-fetch-latest (path)
      (let ((e (f-entries path)))
        (car (sort e (lambda (a b)
                       (not (time-less-p (aj-mtime a)
                                         (aj-mtime b))))))))
    (defun aj-mtime (f) (let ((attrs (file-attributes f))) (nth 5 attrs)))
    

    【讨论】:

    • 这适用于 Emacs 26.1,假设你已经安装了 F
    【解决方案3】:

    如果你想在没有依赖的情况下这样做

    • directory-files-and-attributes 为我们提供了带有属性的文件和目录列表
      • 第 4 个参数 NOSORT 是一个布尔值,不像最佳答案所暗示的那样采用函数

      (directory-files-and-attributes DIRECTORY &optional FULL MATCH NOSORT ID 格式)
      如果 NOSORT 不为零,则列表未排序——它的顺序是不可预测的。 如果您打算自己对结果进行排序,则 NOSORT 很有用。

      • 属性的格式为file-attributes - 它为我们提供了修改时间以及项目是文件还是目录
      1. t 表示目录,字符串(链接到的名称)表示符号链接,或 nil。\
      2. 最后修改时间,同样。这是最后一次
    (car
     (seq-find
      '(lambda (x) (not (nth 1 x))) ; non-directory
      (sort
       (directory-files-and-attributes path 'full nil t)
       '(lambda (x y) (time-less-p (nth 5 y) (nth 5 x)))))) ; last modified first: y < x
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多