Сортировать каталоги-файлы - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующие каталоги:

  • 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 голосов
/ 06 июня 2018

Предоставление пользовательской функции предиката, извлекающей числовую часть:

(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)))))
0 голосов
/ 06 июня 2018

Как описано в справочном документе для сортировки directory-files, используется предикат string-lessp, для которого (string-lessp "100" "9") возвращает t.Вы можете написать свой собственный предикат и установить для nosort значение true и использовать cl-sort для сортировки содержимого путем извлечения числовой части строк.Если вы находитесь на машине с доступом к sort -V, вы можете просто обернуть команду оболочки:

(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 должно привести к желаемому порядку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...