Поиск файлов по именам

11

Как я могу перенести все файлы с именами, которые соответствуют определенному регулярному выражению, рекурсивно в дереве каталогов, в один буфер?

Так я могу переименовать / удалить их все сразу?

iLemming
источник
2
Вы уже подумали "найти имя по имени"? (Использует подстановочный знак, а не регулярные выражения.)
Marco Wahl
2
Вы должны представить это как ответ @MarcoWahl. Я понятия не имел, что мог сделать это!
Тайлер
1
Библиотека find-dired+.elдает вам расширенную версию команды find-name-dired. Он принимает необязательные аргументы, которые указывают (1) минимальную и максимальную глубины поиска и (2) пути, которые необходимо исключить из поиска.
Дрю

Ответы:

11

Wildcard

использование

M-x find-name-dired

получить файлы в соответствии с подстановочным знаком.

пример

Найдите все файлы с суффиксом "org" в каталоге "~ / org /". Введите следующее

M-x find-name-dired
~/org
*org

и наслаждаться.

Регулярное выражение

использование

M-x find-dired

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

пример

Найдите все файлы с суффиксом "org" в каталоге "~ / org /". Введите следующее

M-x find-dired
~/org
-regex ".*org$"

и наслаждаться.

Марко Валь
источник
Можно ли автоматизировать этот процесс, где автоматически проверять, *orgне вводя его вручную
Alper
Если я вас правильно понимаю, есть много возможностей. Например, создайте специальную команду seach с помощью (defun my-find-orgfiles () (интерактивный) (find-name-dired "~ / myorgs /" "* org")) и поместите ее в файл инициализации. Затем используйте Mx my-find-orgfiles RET. Или даже связать команду с ключом.
Марко Валь
Можно ли my-find-orgfiles ()после "t" и "Q" // выбрать все и применить? @Marco Wahl
Alper
2

Регулярное выражение

Чтобы использовать регулярные выражения, вы также можете попробовать find-lisp-find-dired. Эта команда относится к стандартному lib. find-lisp , который полностью написан на elisp, т.е. вам не нужно устанавливать внешнюю findпрограмму.

Например, ниже показаны все файлы с расширением '.el' в каталоге ~ / lisp:

M-x find-lisp-find-dired RET ~/lisp RET \.el\' RET

(Матч наград case-fold-search).

Wildcard

Стоит отметить, что со следующего выпуска Emacs (v26.1) Dired поддерживает wilcards в каталожной части аргумента имени файла. Это означает, что следующие работы:

C-x d ~/soft/*/*.c RET

(Совпадение чувствительно к регистру).

Эта команда показывает в буфере Dired все файлы с расширением «.c», 2 уровня глубины в «~ / soft» . Это означает, что будут перечислены все файлы, такие как «~ / soft / foo / bar.c» , но не такие файлы, как «~ / soft / qux.c» или «~ / soft / foo / baz / qux.c» .

То же самое, но без учета регистра:

C-x d ~/soft/*/*.[cC] RET

бонус

Если вы используете Dired с 'ls', реализованным в elisp, 'ls-lisp' или 'eshell-ls', то вы можете рекурсивно перечислить все файлы, соответствующие шаблону, со следующим синтаксисом:

C-x d ~/soft/**/*.c RET

Обратите внимание '**'. В этом случае отображаются все файлы в «~ / soft», соответствующие шаблону, даже «~ / soft / qux.c» .

Однако при использовании insert-directory-program подстановочного знака расширение производится системной оболочкой; это означает, что этот рекурсивный синтаксис '**' просто работает, если он поддерживается вашей оболочкой. Например, zsh поддерживает это, а bash - нет. С оболочками, отличными от zsh, предыдущая команда будет делать то же самое, что и:

C-x d ~/soft/*/*.c RET
Tino
источник