【问题标题】:Sort files in dired by full path按完整路径对目录中的文件进行排序
【发布时间】:2012-11-19 00:02:45
【问题描述】:

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

有什么办法可以

  1. 读入该外部排序的文件并以dired“模式”(类似于编译模式)打开它,
  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

【问题讨论】:

  • 我想您使用的是find-name-dired 而不是dired-find-file(无法搜索文件)。
  • 好的,谢谢!我相应地编辑了我的问题。

标签: emacs dired


【解决方案1】:

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

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

 -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")

【讨论】:

  • 听起来很有希望,但它对我不起作用。我的“find”命令告诉我“-s”是一个未知谓词,“man find”没有提到“-s”开关。 “man ls”也没有列出任何有希望的东西。我还在找。
  • 看起来“-s”开关只存在于 Mac OS X 版本的“find”,而不是 Linux 版本。
  • 对不起! (不仅仅是 Mac OS X:FreeBSD 也是如此。)您在其他答案中的解决方案对我来说看起来不错。
【解决方案2】:

好的,我想出了如何使用 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))

【讨论】:

    【解决方案3】:

    这是一种通过临时更改配置手动完成的方法:

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

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

    【讨论】:

    • 看来我可以使用 around-advice 来更整洁有效地实现这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2012-03-26
    • 2014-11-21
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多