2009-03-18 3 views
30

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

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

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

+0

Возможный дубликат [Как найти все файлы, содержащие определенный текст в Linux?] (Https://stackoverflow.com/questions/16956810/how-do-i-find-all-files-containing-specific-text -on-linux) – Bruno

ответ

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

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

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

:e **/filename.cpp 

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

+0

@Bryan Oakley, Спасибо за редактирование, но он переписал мое дополнение о Vim! Я переформулировал аргумент каталога в своем ответе. Благодарю. – strager

+0

Спасибо за подсказку vim. Это один полезный, который я до сих пор не знал: P – skinp

+1

Есть ли все-таки сделать это в текущем каталоге, не набирая его полностью? –

0

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

2

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

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

7

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

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

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

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

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

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

для этого.

1

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

0

locate <file_pattern>

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

Смежные вопросы