对目录文件进行排序

时间:2018-06-06 12:42:23

标签: sorting emacs

我有以下目录:

  • MOD01
  • mod02
  • mod03
  • ...
  • mod100

当我使用

(list (directory-files dir t "\\(mod\\)\\([0-9]\\)" nil))

输出是:

  • MOD01
  • mod02
  • mod03
  • ...
  • MOD10
  • mod100
  • ...
  • mod99

如您所见, mod100 位置不正确。所需的输出为:

  • MOD01
  • mod02
  • ...
  • MOD10
  • MOD11
  • ...
  • mod100

感谢您的建议

2 个答案:

答案 0 :(得分:1)

提供自定义谓词函数,提取数字部分:

(sort
 (directory-files dir t "\\(mod\\)\\([0-9]\\)" nil)
 (lambda (x y)
   (<
    (string-to-number (replace-regexp-in-string ".*mod\\([[:digit:]]+\\).*" "\\1" x))
    (string-to-number (replace-regexp-in-string ".*mod\\([[:digit:]]+\\).*" "\\1" y)))))

答案 1 :(得分:0)

directory-files排序的帮助文档中所述,使用谓词string-lessp,其中(string-lessp "100" "9")返回t。您可以编写自己的谓词并将nosort设置为true,并使用cl-sort通过提取字符串的数字部分对内容进行排序。如果您在可以访问sort -V的计算机上,则可以包装shell命令

(defun my-sort (&optional dir)
  (interactive "D")
  (with-temp-buffer
    (shell-command
     (concat "ls " (shell-quote-argument (or dir default-directory)) "| sort -V")
     (current-buffer))
    (split-string (buffer-string) "\n")))

使用sort版本排序应该会产生所需的排序。