Найти файлы: получение заданного буфера файлов, заданных фильтром, содержащим текст

Это кажется довольно типичным вариантом использования, но будь я проклят, если смогу в этом разобраться. Должно быть что-то фундаментальное, что мне не хватает.

find-dired - это, по сути, интерфейс для команды find, которая дает dired-buffer результатов

find-grep-dired, похоже, больше похож на интерфейс для grep, чем на find. и дает dired-buffer, но ищет все файлы в дереве каталогов.

Я бы хотел иметь возможность начать с заданного пути и искать в * .css для # some-id и получить от него dired-buffer для дальнейшей обработки.

Кажется, все части есть, но я этого не понял. Так что я думаю, что это что-то фундаментальное, что я, возможно, упустил.


person Tom Willis    schedule 18.01.2010    source источник
comment
Какая дальнейшая обработка? Поиск? Искать и заменить? Что-то другое?   -  person Wayne Conrad    schedule 18.01.2010
comment
поиск и замена, вероятно, будут обычным явлением, да, но в буфере dired, возможно, я хочу переместить / скопировать их в другой каталог или удалить их в основном любой из команд, которые вы можете выполнить в dired.   -  person Tom Willis    schedule 18.01.2010
comment
Я собирался предложить найти файлы, пометить их (% m), а затем использовать команды A (поиск по регулярному выражению) и Q (поиск и замена по регулярному выражению). Но вам нужно более общее решение.   -  person Wayne Conrad    schedule 18.01.2010


Ответы (4)


Похоже, что вам нужна функция grep < / а>. Он вызовет утилиту grep с указанным вами выражением и соберет вывод в интерактивном буфере. Вы можете выбрать любую из строк совпадения в буфере, чтобы перейти к той строке в файле, из которого получено совпадение.

Например, если вы запустите M-x grep, вы должны получить следующее приглашение в мини-буфере:

Run grep (like this): grep -n

Затем вы добавляете шаблон regexp и glob, который хотите передать в grep:

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

И он должен предоставить вам список совпадений для #some-id во всех файлах, соответствующих *.css в текущем каталоге. Если вы хотите рекурсивно просматривать подкаталоги, вам нужно использовать rgrep вместо grep. Это похоже на то, что вы ищете, или я совершенно неправильно понял вашу просьбу?

person A. Levy    schedule 18.01.2010
comment
почти, мне нужно, чтобы это было в сочетании с find для рекурсии, если только grep не может сделать это. - person Tom Willis; 18.01.2010
comment
Попробуйте rgrep. Он использует find для рекурсивного просмотра подкаталогов и поиска всех файлов в них. - person A. Levy; 19.01.2010
comment
ah rgrep ближе, единственное, чего не хватает, это вывода в dired буфер, поэтому я могу делать такие вещи, как выбор / перемещение / копирование всех этих файлов сразу. - person Tom Willis; 19.01.2010

Это немного поздно, но вот функция 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-dired и find-name-dired с сопоставлением имен файлов без учета регистра.

person coredump    schedule 26.08.2013

Я отдаю должное А. Леви. Но я думаю, что разобрался. Кажется, что find-dired действительно является инструментом для этой работы, но на моем компьютере с Windows он не заполняет аргументы предварительно с помощью «-exec grep», и меня не осенило, что это нужно сделать. Однако моя Linux-машина предварительно заполняет ее с помощью grep.

So....

  #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 \{\} \; 
person Tom Willis    schedule 18.01.2010

Вы сказали (в комментарии):

единственное, чего не хватает, - это вывода в буферный буфер, поэтому я могу делать такие вещи, как выбор / перемещение / копирование всех этих файлов сразу

Извините, я не видел этого вопроса до сих пор. Эта функция доступна в Dired +. Команда diredp-grepped-files-other-window открывает Dired для файлов, отмеченных grep попаданиями. (Это также работает для любого другого режима, производного от compilation-mode.)

person Drew    schedule 05.06.2015