按完整路径对dired文件进行排序

时间:2012-11-30 18:11:31

标签: emacs dired

我正在使用find-name-dired来查找多个文件的实例,这些文件都具有相同的名称(称为foo.txt)但在不同的目录中。我希望按文件路径的字母顺序列出文件。但是,它们列在看似随机的顺序中。 dired-sort-menudired-sort-chiesa都不会对find-name-dired的输出进行排序,即使它可以在其他dired缓冲区(其格式看起来非常相似)上工作。如果我将dired缓冲区的内容写入文件,我就可以打开一个shell并将该文件提交给shell中的sort命令,该命令使用第9个字段(路径)作为键。这会产生看起来正确的输出,但当然它不再是一个直接缓冲区。

有没有办法可以

  1. 读入外部排序的文件并以dired“模式”打开(类似于编译模式),
  2. 在仍然处于直接模式或
  3. 时对find-name-dired的输出进行排序
  4. 从find-name-dired生成输出,它按照我想要的方式从头开始排序?
  5. 更新:

    只是为了使事情更具体,这是当前的缓冲区:

    /home/afrankel/Documents/emacs_test/:
    find . \( -iname foo.txt \) -exec ls -ld \{\} \;
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 a/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 b/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 d/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 c/z/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 c/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 f/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 e/foo.txt
    
    find finished at Fri Nov 30 17:00:41
    

    按“s”(将对大多数可变缓冲区进行排序)会出现错误“无法对此可变缓冲区进行排序”。

    我希望缓冲区看起来像这样:

    /home/afrankel/Documents/emacs_test/:
    find . \( -iname foo.txt \) -exec ls -ld \{\} \;
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 a/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 b/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 c/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 c/z/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 d/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 e/foo.txt
    -rw-r--r--   1 afrankel users        4 Nov 30 16:59 f/foo.txt
    
    find finished at Fri Nov 30 17:00:41
    

3 个答案:

答案 0 :(得分:3)

在“普通”Dired缓冲区中键入 s 时,Dired实际上并不对缓冲区进行排序。它的作用是更改dired-actual-switches的值,使其包含-t选项(“按修改时间排序”),然后调用revert-buffer -runs ls带有新选项。这显然不适用于通过运行find生成的Dired缓冲区。

您需要做的是安排使用find选项运行-s

 -s      Cause find to traverse the file hierarchies in lexicographical
         order, i.e., alphabetical order within each directory.

您可以通过评估

来执行(对于所有find-dired命令)
(setq find-program "find -s")

答案 1 :(得分:0)

这是通过临时更改配置手动执行此操作的一种方法:

  1. 运行M-x customize-group find-dired。
  2. 更改“查找Ls选项”字段的内容。它最初应为“-exec ls -ld {} \;”。附加文本使其显示为“-exec ls -ld {} \; | sort --key = 9”。 (换句话说,按字段9排序,这是作为单个字符串处理的完整路径。)
  3. 仅设置当前会话的选项。
  4. 更新:最好使用defadvice,就像我在其他(后面)的回答中所做的那样。

答案 2 :(得分:0)

好的,我想出了如何使用defadvice自动更改find​​-ls-option的值,同时我执行新的包装函数(find-name-dired-sorted)然后更改它回到原来的价值。

(defadvice find-name-dired (around find-name-dired-around)
  "Advice: Sort output by path name."
  (let ((find-ls-option (list "-exec ls -ld {} \\; |sort --key=9")))
   ad-do-it))

(defun find-name-dired-sorted (dir pattern)
    "Sort the output of find-name-dired by path name."
    (interactive
     "DFind-name (directory): \nsFind-name (filename wildcard): ")
    (ad-activate 'find-name-dired)
    (find-name-dired dir pattern)
    (ad-deactivate 'find-name-dired))