Подтвердить что ты не робот

Найти файл в каталоге из командной строки

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

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

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

4b9b3361

Ответ 1

find /root/directory/to/search -name 'filename.*'
# Directory is optional (defaults to cwd)

Поддерживается стандартное UNIX-подшивка. Подробнее см. man find.

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

:e **/filename.cpp

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

Ответ 2

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

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

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

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

Итак, давайте предположим, что вы хотите искать все эти файлы для строки "ERROR" или редактировать их все. Вы можете выполнить одно из следующих действий:

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

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

Ответ 3

Когда я был в мире 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" не слишком много каталогов для рекурсии... тогда он становится довольно медленным. (например, вы не захотите делать это, начиная с корня "/" )

Ответ 4

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

Ответ 6

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

Ответ 7

locate <file_pattern>

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