Emacs lisp:如何获取目录中的最新文件?

问题描述 投票:0回答:4

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

file emacs directory elisp
4个回答
7
投票

使用内置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
过滤文件/目录列表。


3
投票

使用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)))

1
投票

如果你想在没有依赖的情况下完成

  • directory-files-and-attributes
    为我们提供了带有属性的文件和目录列表
    • 第四个参数
      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

0
投票

via xuchunyang,除了他的版本按逆字典顺序而不是修改时间排序。这个速度较慢,但确实获取了最近修改的文件:

(defun latest-file (path &optional match)
    (car (sort (directory-files path 'full match) #'file-newer-than-file-p)))

;; most recently modified file in ~/.emacs.d
(latest-file "~/.emacs.d")
;; most recently modified file in ~/.emacs.d with .el extension
(latest-file "~/.emacs.d" ".*\\.el$")
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.