查找文件:获取由包含文本的过滤器指定的文件的dired缓冲区

时间:2010-01-18 17:46:08

标签: emacs dired

这似乎是一个非常典型的用例,但如果我能弄明白的话,我会被诅咒。必须有一些我缺少的基本知识。

find-dired基本上是find命令的前端,它产生结果的直接缓冲区

find-grep-dired似乎更像是grep的前端而不是find。并产生一个直接缓冲区,但它会搜索目录树中的所有文件。

我想要的是能够从给定路径开始并搜索* .css以获取#some-id并让它为我提供一个直接缓冲区以供进一步处理。

似乎所有的碎片都在那里,但我还没弄明白。所以我认为这可能是我可能错过的基础。

4 个答案:

答案 0 :(得分:3)

这有点晚了,但这里是我经常使用的emacs-lisp函数:

(defun find-iname-grep-dired (dir pattern regexp)
  (interactive
   "DFind-name (directory): \nsFind-name (filename wildcard): \nsFind-grep (grep regexp): ")
  (find-dired dir (concat "-iname " (shell-quote-argument pattern) " "
                          "-type f -exec " grep-program " " find-grep-options " -e "
                          (shell-quote-argument regexp) " "
                          (shell-quote-argument "{}") " "
                          (shell-quote-argument ";"))))

它将find-grep-diredfind-name-dired与不区分大小写的文件名匹配组合在一起。

答案 1 :(得分:2)

听起来你正在寻找的功能是grep。它将使用您提供的表达式调用grep实用程序,并在交互式缓冲区中收集输出。您可以选择缓冲区中的任何匹配行,以跳转到匹配所在文件中的该行。

例如,如果您运行M-x grep,您应该在迷你缓冲区中收到以下提示:

Run grep (like this): grep -n

然后添加要传递给grep的正则表达式和glob模式:

Run grep (like this): grep -n #some-id *.css

它应该为您提供当前目录中与#some-id匹配的所有文件中*.css的匹配列表。如果你想通过子目录递归,那么你需要使用rgrep而不是grep。这听起来像你正在寻找的,还是我完全误解了你的要求?

答案 2 :(得分:1)

我会给A. Levy信用。但我想我已经明白了。似乎find-dired确实是这项工作的工具,但是在我的Windows机器上它并没有用“-exec grep”预先填充args,而且我没有想到这样做。然而,我的linux机器预先用grep填充它。

...所以

  #on Linux
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): -type f -exec grep -q -e \{\} \; 

  #on windows
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): 

  #Solution
  M-x find-dired
  Run Find in Directory: <current_path> 
  Run find(with args): -type f -iname "*.css" -exec grep -q -e #some-id \{\} \; 

答案 3 :(得分:1)

你说(在评论中):

  

唯一缺少的是输出到一个直接缓冲区 所以我可以做一些事情,比如一次选择/移动/复制所有这些文件

对不起,直到现在我还没有看到这个问题。该功能适用​​于Dired+。命令diredp-grepped-files-other-windowgrep点击指示的文件上打开Dired。 (它也适用于从compilation-mode派生的任何其他模式。)