Найти файл в каталоге из командной строки - PullRequest
41 голосов
/ 18 марта 2009

В редакторах / идентификаторах, таких как eclipse и textmate, есть ярлыки для быстрого поиска определенного файла в каталоге проекта.

Существует ли аналогичный инструмент для завершения полного пути к именам файлов в каталоге (рекурсивно), в bash или другой оболочке?

У меня есть проекты с большим количеством каталогов, и глубокие (вздох, java). При нажатии на вкладку в оболочке циклически перебираются только файлы в ближайшем каталоге, этого недостаточно = /

Ответы [ 7 ]

61 голосов
/ 18 марта 2009
find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)

Поддерживается стандартная глобализация в UNIX. См. man find для получения дополнительной информации.

Если вы используете Vim, вы можете использовать:

:e **/filename.cpp

Или :tabn, или любая команда Vim, которая принимает имя файла.

8 голосов
/ 18 марта 2009

Если вы хотите что-то сделать со списком файлов, вы можете использовать find в сочетании с конструкцией bash $() (лучше, чем обратные пометки, так как разрешено вложение).

например, допустим, что вы находитесь на верхнем уровне каталога вашего проекта и хотите получить список всех файлов C, начинающихся с "btree". Команда:

find . -type f -name 'btree*.c'

вернет список из них. Но это не очень помогает с ними что-то делать.

Итак, давайте предположим, что вы хотите найти во всех этих файлах строку «ОШИБКА» или отредактировать их все. Вы можете выполнить одно из:

grep ERROR $(find . -type f -name 'btree*.c')
vi $(find . -type f -name 'btree*.c')

чтобы сделать это.

2 голосов
/ 18 марта 2009

Когда я был в мире UNIX (используя tcsh (sigh ...)), я имел обыкновение настраивать псевдонимы / скрипты "find" для поиска файлов. Я думаю, что синтаксис поиска по умолчанию немного неуклюж, поэтому я использовал псевдонимы / сценарии для передачи «find. -Print» в grep, что позволяет вам использовать регулярные выражения для поиска:

# finds all .java files starting in current directory
find . -print | grep '\.java'

#finds all .java files whose name contains "Message"
find . -print | grep '.*Message.*\.java'

Конечно, приведенные выше примеры могут быть выполнены с простой старой поиской, но если у вас есть более конкретный поиск, grep может немного помочь. Это работает довольно хорошо, если только «find. -Print» не имеет слишком много каталогов для просмотра ... тогда это становится довольно медленным. (например, вы не захотите делать это, начиная с корня "/")

1 голос
/ 20 декабря 2009

Я использую этот скрипт для быстрого поиска файлов по каталогам в проекте. Я обнаружил, что он отлично работает и использует автозаполнение Vim, открывая и закрывая новый буфер для поиска. Это также разумно завершает максимально возможное для вас, так что вы обычно можете просто ввести один или два символа и открыть файл в любом каталоге вашего проекта. Я начал использовать его специально из-за проекта Java, и это сэкономило мне много времени. Вы просто создаете кэш один раз, когда начинаете сеанс редактирования, набирая: FC (имена каталогов). Вы также можете просто использовать. получить текущий каталог и все подкаталоги. После этого вы просто набираете: FF (или FS, чтобы открыть новый сплит), и он откроет новый буфер, чтобы выбрать нужный файл. После выбора файла временный буфер закрывается, и вы попадаете в запрошенный файл и можете начать редактирование. Кроме того, здесь - это еще одна ссылка на переполнение стека, которая может помочь.

0 голосов
/ 01 ноября 2017

locate <file_pattern>

*** find, безусловно, будет работать и может предназначаться для определенных каталогов. Однако эта команда медленнее, чем команда locate. В ОС Linux каждое утро создается база данных, которая содержит список всех каталогов и файлов, и команда locate эффективно выполняет поиск в этой базе данных, поэтому, если вы хотите выполнить поиск файлов, которые не были созданы сегодня, был бы самый быстрый способ выполнить такую ​​задачу.

0 голосов
/ 18 марта 2009

Да, bash имеет механизмы завершения имени файла. Я не использую их сам (слишком ленив, чтобы учиться, и я не нахожу это необходимым достаточно часто, чтобы сделать это срочным), но основной механизм заключается в наборе первых нескольких символов, а затем табуляции; это расширит имя настолько, насколько это возможно (возможно, совсем не так), пока имя однозначно. На странице хорошего старого руководства есть множество команд в стиле Emacs, связанных с завершением.

0 голосов
/ 18 марта 2009

http://content.hccfl.edu/pollock/Unix/FindCmd.htm

Команда linux / unix "find".

...