我正在使用find-name-dired来查找多个文件的实例,这些文件都具有相同的名称(称为foo.txt)但在不同的目录中。我希望按文件路径的字母顺序列出文件。但是,它们列在看似随机的顺序中。 dired-sort-menu和dired-sort-chiesa都不会对find-name-dired的输出进行排序,即使它可以在其他dired缓冲区(其格式看起来非常相似)上工作。如果我将dired缓冲区的内容写入文件,我就可以打开一个shell并将该文件提交给shell中的sort命令,该命令使用第9个字段(路径)作为键。这会产生看起来正确的输出,但当然它不再是一个直接缓冲区。
有没有办法可以
更新:
只是为了使事情更具体,这是当前的缓冲区:
/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
答案 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)
这是通过临时更改配置手动执行此操作的一种方法:
更新:最好使用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))