2

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

有没有办法我可以

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

更新:

只是为了让事情更具体一点,这里是当前缓冲区:

/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”(这将对大多数 dired 缓冲区进行排序)给出错误“无法排序这个 dired 缓冲区”。

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

/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
4

3 回答 3

3

当你输入s一个“正常”的 Dired 缓冲区时,Dired 实际上并没有对缓冲区进行排序。它所做的是更改 的值,dired-actual-switches以便它包含(或不包含)-t选项(“按修改时间排序”),然后调用which使用新选项revert-buffer重新运行。ls这显然在运行产生的 Dired 缓冲区中不起作用find

您需要做的是安排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")
于 2012-12-01T12:16:30.423 回答
0

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

  1. 运行 Mx customize-group find-dired。
  2. 更改“查找 Ls 选项”字段的内容。它最初应为“-exec ls -ld {} \;”。附加文本使其显示为“-exec ls -ld {} \; |sort --key=9”。(换句话说,按字段 9 排序,它是将完整路径视为单个字符串。)
  3. 仅为当前会话设置选项。

更新:最好使用 defadvice,就像我在其他(后来的)答案中所做的那样。

于 2012-12-01T18:33:29.070 回答
0

好的,我想出了如何使用 defadvice 在执行我的新包装函数(find-name-dired-sorted)时自动更改 find-ls-option 的值,然后将其更改回其原始值.

(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))
于 2012-12-02T17:22:26.890 回答