Я пытаюсь найти способ сканировать всю систему Linux на наличие всех файлов, содержащих определенную строку текста. Просто чтобы уточнить, я ищу текст в файле, а не в имени файла.
Когда я искал, как это сделать, я дважды сталкивался с этим решением:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Тем не менее, это не работает. Кажется, для отображения каждого файла в системе.
Это близко к правильному способу сделать это? Если нет, то как я должен? Эта возможность находить текстовые строки в файлах была бы чрезвычайно полезна для некоторых программных проектов, которыми я занимаюсь.
.
как подстановочный знак с одним символом, среди других. Мой совет: всегда используйте fgrep или egrep.-H
на-l
(и, возможно,grep
наfgrep
). Чтобы исключить файлы с определенными шаблонами имен, вы должны использоватьfind
более сложный способ. Однако стоит научиться пользоватьсяfind
. Простоman find
.find … -exec <cmd> +
легче набрать и быстрее, чемfind … -exec <cmd> \;
. Это работает, только если<cmd>
принимает любое количество аргументов имени файла. Экономия времени выполнения особенно велика, если<cmd>
запускать медленно, как скрипты Python или Ruby.grep "pattern" path/*.txt
Ответы:
Сделайте следующее:
-r
или-R
является рекурсивным,-n
номер строки, и-w
означает совпадение всего слова.-l
(нижний регистр L) можно добавить, чтобы просто дать имя файла совпадающих файлов.Наряду с этим,
--exclude
,--include
,--exclude-dir
флаги могут быть использованы для эффективного поиска:Это будет искать только в тех файлах, которые имеют расширения .c или .h:
Это исключит поиск всех файлов с расширением .o:
Для каталогов можно исключить определенный каталог (и) через
--exclude-dir
параметр. Например, это исключит dirs dir1 /, dir2 / и все они будут соответствовать * .dst /:Это очень хорошо работает для меня, чтобы достичь почти такой же цели, как ваша.
Для более подробной информации проверьте
man grep
.источник
r
опция ленивая (сначала проходит по глубине, затем останавливается после первого каталога), ноR
является жадной (будет правильно проходить по всему дереву).R
enr
будет проходить оба каталога правильно, ноR
будет следовать символическим ссылкам.Вы можете использовать
grep -ilR
:i
означает игнорировать регистр (необязательно в вашем случае).R
обозначает рекурсивный.l
расшифровывается как «показать имя файла, а не сам результат»./
обозначает начало в корне вашей машины.источник
-i
он сильно замедляется, поэтому не используйте его, если не нужно. Проверьте это в определенном каталоге, а затем обобщите. Это должно быть завершено в течение нескольких минут. Я думаю, что регулярное выражение сделало бы это медленнее. Но мои комментарии основаны на предположениях, я предлагаю вам проверить этоtime
перед строкой./*
стоит за это. Во всяком случае, я просто проверил это и заметил, что просто/
работает.fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.grep -Ril "text-to-find-here" ~/sites/
или использовать. для текущего каталогаgrep -Ril "text-to-find-here" .
Вы можете использовать ACK . Это как grep для исходного кода. Вы можете сканировать всю вашу файловую систему с ним.
Просто делать:
В вашем корневом каталоге.
Вы также можете использовать регулярные выражения , указать тип файла и т. Д.
ОБНОВИТЬ
Я только что обнаружил Silver Searcher , который похож на ack, но в 3-5 раз быстрее его и даже игнорирует шаблоны из
.gitignore
файла.источник
Ты можешь использовать:
r
Означает рекурсивные и так будет искать пути , указанные , а также его подкаталоги. Это скажет вам имя файла, а также распечатает строку в файле, где появляется строка.Или команда, аналогичная той, которую вы пытаетесь (пример:) искать во всех файлах javascript (* .js):
Это напечатает строки в файлах, где появляется текст, но не напечатает имя файла.
В дополнение к этой команде мы также можем написать это: grep -rn "String to search" / path / to / directory / или / file -r: рекурсивный поиск n: номер строки будет показан для совпадений
источник
Вы можете использовать это:
источник
Список имен файлов, содержащих данный текст
Прежде всего, я считаю, что вы использовали
-H
вместо-l
. Также вы можете попробовать добавить текст внутри кавычек с последующим{} \
.пример
Допустим, вы ищете файлы, содержащие определенный текст «Лицензия Apache» внутри вашего каталога. Он будет отображать результаты, несколько похожие на приведенные ниже (вывод будет отличаться в зависимости от содержимого каталога).
Удалить регистр чувствительности
Даже если вы не используете регистр, например «текст» или «текст», вы можете использовать
-i
переключатель, чтобы игнорировать регистр. Вы можете прочитать более подробную информацию здесь .Надеюсь, это поможет вам.
источник
find
передаст все пути, которые она найдет, командеgrep -l "text-to-find-here" <file found>"
. Вы можете добавить ограничения к имени файла, например,find / -iname "*.txt"
для поиска только в файлах, имя которых заканчивается.txt
-iname
, нечувствительно к регистру, что означает, что он также найдет, например, файлы .TXT, а также TxT и TXt и так далее.grep
( GNU или BSD )Вы можете использовать
grep
инструмент для рекурсивного поиска в текущей папке, например:Примечание:
-r
- Рекурсивный поиск в подкаталогах.Вы также можете использовать синтаксис globbing для поиска в определенных файлах, таких как:
Примечание. Используя параметр globbing (
**
), он рекурсивно сканирует все файлы с определенным расширением или шаблоном. Чтобы включить этот синтаксис, выполните следующую команду:shopt -s globstar
. Вы также можете использовать**/*.*
для всех файлов (за исключением скрытых и без расширения) или любой другой шаблон.Если вы ошиблись в том, что ваш аргумент слишком длинный, попробуйте сузить область поиска или используйте
find
вместо этого такой синтаксис, как:В качестве альтернативы используйте
ripgrep
.ripgrep
Если вы работаете над большими проектами или большими файлами, вы должны использовать
ripgrep
вместо этого, например:Ознакомьтесь с документами, инструкциями по установке или исходным кодом на странице проекта GitHub .
Это гораздо быстрее , чем любой другой инструмент , как GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
или подобное, так как он построен на вершине регулярных выражений Руста , который использует конечные автоматы, SIMD и агрессивные буквенные оптимизации , чтобы сделать поиск очень быстро.Он поддерживает шаблоны игнорирования, указанные в
.gitignore
файлах, поэтому один путь к файлу можно сопоставить с несколькими шаблонами глобуса одновременно.Вы можете использовать общие параметры, такие как:
-i
- Нечувствительный поиск.-I
- игнорировать двоичные файлы.-w
- Поиск целых слов (в отличие от частичного совпадения слов).-n
- Показать линию вашего матча.-C
/--context
(например-C5
) - Увеличивает контекст, поэтому вы видите окружающий код.--color=auto
- Отметьте соответствующий текст.-H
- Отображает имя файла, где находится текст.-c
- Отображает количество совпадающих линий. Можно комбинировать с-H
.источник
Если ваш
grep
не поддерживает рекурсивный поиск, вы можете комбинироватьfind
сxargs
:Я считаю, что это легче запомнить, чем формат для
find -exec
.Это выведет имя файла и содержимое совпавшей строки, например
Необязательные флаги, к которым вы можете добавить
grep
:-i
- поиск без учета регистра-l
- выводить только имя файла, в котором найдено совпадение-h
- выводить только строку, которая соответствует (не имя файла)источник
grep 'text-to-find-here'
без имени файла, еслиfind
ничего не находит. Это будет зависать и ждать ввода пользователя! Добавить--no-run-if-empty
в качестве опцииxargs
.find … -exec grep … +
. Если вы настаиваете на использовании find вместе с xargs, используйте-print0
и-0
.i
: Игнорировать различия регистра как в PATTERN, так и во входных файлах.n
: Добавьте к каждой строке выходных данных номер строки на основе 1 в своем входном файле.s
: Подавлять сообщения об ошибках несуществующих или нечитаемых файлов.r
: Рекурсивно читать все файлы в каждом каталоге.источник
Есть новая утилита под названием Silversearcher
Он тесно сотрудничает с Git и другими VCS. Так что вы ничего не получите в .git или другом каталоге.
Вы можете просто использовать
И это сделает задачу за вас!
источник
Если вы используете find как в вашем примере, лучше добавьте
-s
(--no-messages
) вgrep
, и2>/dev/null
в конце команды, чтобы избежать большого количества сообщений об отказе в разрешении, выданныхgrep
иfind
:find - это стандартный инструмент для поиска файлов - в сочетании с grep при поиске определенного текста - на Unix-подобных платформах. Находкой команда часто сочетается с xargs , кстати.
Для этой цели существуют более быстрые и простые инструменты - см. Ниже. Лучше их попробовать, если они доступны на вашей платформе , конечно:
Более быстрые и легкие альтернативы
RipGrep - самый быстрый инструмент поиска:
Серебряный Искатель :
подтверждение :
Примечание: Вы также можете добавить
2>/dev/null
к этим командам, чтобы скрыть много сообщений об ошибках.Предупреждение : если вы действительно не можете избежать этого, не ищите из '/' (корневой каталог), чтобы избежать длительного и неэффективного поиска! Поэтому в приведенных выше примерах вам лучше заменить ' / ' на имя подкаталога, например, "/ home", в зависимости от того, где вы действительно хотите искать ...
источник
grep
find
не ищет непосредственно внутри файлов текст. И, может быть, эти дополнительные инструменты полезны для некоторых, но старых таймеров, и те, к кому хорошо привыкли, напримерgrep
, не дадут им вообще никакого времени (ну, конечно, я не буду). Не говоря, что они бесполезны.fol
? Нет, конечно нет; это называлосьdir
(и я верю, что это все еще). Папка - вещь, придуманная (я полагаю) удобством для пользователя, хотя в этом случае она, возможно, притупляет ее для менее «продвинутых» пользователей?Пытаться:
источник
xargs
как это .. рассмотреть это.echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
,xargs
Здесь соответствуют не тому файлу и не соответствуют намеченному файлу. Либо использовать,find .. -print0 | xargs -0 ...
но это бесполезное использование трубы или лучшеfind ... -exec grep ... {} +
Используйте
pwd
для поиска в любом каталоге, в котором вы находитесь, повторяя внизОбновление В зависимости от используемой вами версии grep, вы можете опустить ее
pwd
. В более новых версиях.
, по-видимому, по умолчанию используется grep, если каталог не указан таким образом:grep -rnw -e "pattern"
или
grep -rnw "pattern"
будет делать то же самое, что и выше!
источник
pwd
вообще не обязательно, так как это значение по умолчанию.grep -rnw "pattern"
достаточно.grep -rnw
, что было дано три года назад, я не вижу, как этот ответ добавляет ценность.grep -rnw '/path/to/somewhere/' -e "pattern"
то, что у вас есть здесь. 5 голосов после 2,3 млн посещений не так уж много значит.grep
может использоваться, даже если мы не ищем строку.Просто работает,
распечатает путь ко всем текстовым файлам, т. е. содержащим только печатные символы.
источник
ls
илиfind
(для рекурсивного)Вот несколько списков команд, которые можно использовать для поиска файла.
источник
egrep
эквивалентен,grep -E
и это означает, что--extended-regexp
вы можете найти подробности здесь unix.stackexchange.com/a/17951/196072Silver Searcher - потрясающий инструмент, но ripgrep может быть даже лучше.
Он работает на Linux, Mac и Windows и был написан на Hacker News пару месяцев назад (здесь есть ссылка на блог Эндрю Галланта, на котором есть ссылка на GitHub):
Ripgrep - новый инструмент поиска командной строки
источник
Объяснение из комментариев
find - это команда, которая позволяет вам находить файлы и другие объекты, такие как каталоги и ссылки, в подкаталогах данного пути. Если вы не указываете маску, которой должны соответствовать имена файлов, она перечисляет все объекты каталога.
источник
Пытаться:
который будет искать все файловые системы, потому что
/
это корневая папка.Для использования домашней папки:
Для текущей папки используйте:
источник
Надеюсь, это поможет ...
Развернуть
grep
бит, чтобы дать больше информации в выводе, например, чтобы получить номер строки в файле, где находится текст, можно сделать следующим образом:И если у вас есть представление о типе файла, вы можете сузить область поиска, указав для поиска расширения типов файлов, в данном случае
.pas
ИЛИ.dfm
файлы:Краткое объяснение вариантов:
.
вfind
указанном из текущего каталога.-name
«*.*
»: Для всех файлов (-name «*.pas
» -o -name «*.dfm
»): только*.pas
ИЛИ*.dfm
файлы, или указаны с-o
-type f
указывает, что вы ищете файлы-print0
и--null
с другой стороны|
(трубы) являются важными из них, передавая имя файла отfind
доgrep
встроенных вxargs
, что позволяет для прохождения имен файлов с пробелами в именах файлов, что позволяет Grep относиться путь и имя файла , как одну строку, и не разбивайте его на каждом пространстве.источник
-name '*.*'
не то, что вы говорите; он не обнаружит файл с именем «file», потому что шаблон не соответствует этому (нет .ext);*
однако (хорошо. файлы в стороне). Но есть еще одна вещь: если вам нужны все файлы, зачем вообще указывать имя файла? Никаких других комментариев - за исключением того, что приятно знать, что все еще есть люди, которые не используют терминологию «папка» в терминологии MS (которую, на самом деле, после того, как я сказал это достаточно, я бы не стал добавлять, но я хотел бы отметить слегка неверное заявление, которое вы сделали с именами файлов - а также избыточность / бесполезность в случае «все»).Простое
find
может работать удобно. алиас это в вашем~/.bashrc
файле:Запустите новый терминал и выполните команду:
источник
Я написал скрипт Python, который делает что-то подобное. Вот как следует использовать этот скрипт.
Первый аргумент
path
- это каталог, в котором мы будем искать рекурсивно. Второй аргументpattern_to_search
- это регулярное выражение, которое мы хотим найти в файле. Мы используем формат регулярного выражения, определенный в библиотеке Pythonre
. В этом сценарии.
также соответствует символ новой строки.Третий аргумент
file_pattern
, является необязательным. Это еще одно регулярное выражение, которое работает с именем файла. Будут рассматриваться только те файлы, которые соответствуют этому регулярному выражению.Например, если я хочу искать файлы Python с расширением,
py
содержащимPool(
после словаAdaptor
, я делаю следующее,И вуаля, он генерирует путь сопоставленных файлов и номер строки, по которой совпадение было найдено. Если найдено более одного совпадения, то каждый номер строки будет добавлен к имени файла.
источник
Если вы строго хотите использовать,
find
используйтеfind + grep
:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
шаги:
1. Используйте
find
для поиска файлов,2. Затем выполните
grep
на всех из них.Это может дать вам возможность
find
найти файлы.Используйте,
-name Pattern
если вы хотитеgrep
только определенные файлы:find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Вы можете играть с ним и использовать различные варианты
find
чтобы улучшить или сузить поиск файлов.источник
Использование:
Это сообщит, сколько копий вашего шаблона находится в каждом из файлов в текущем каталоге.
источник
grep - ваш хороший друг, чтобы достичь этого.
Если вам не нужен регистр текста для поиска, используйте:
источник
-
в строке поиска есть какие-то s, вы--
сначала захотите передать их в grep; в противном случае это может вызвать интересные побочные эффекты!Я очарован тем, как просто grep делает это с помощью 'rl':
Работает просто отлично ...
источник
.txt
). Или есть способ сделать это?Для поиска строки и вывода только этой строки вместе со строкой поиска:
например:
Чтобы отобразить имя файла, содержащее строку поиска:
например:
источник
find … -exec grep 'str' {} \;
(если вы должны использоватьfind
вообще).find
пробелами, мог привестиgrepping
к неправильным файлам и / или отсутствию нужных файлов. Просто используйте,find ... -exec grep ...
если у вас есть необходимость использоватьfind
.. но в этом случаеgrep -r ...
достаточно.Существует
ack
инструмент, который будет делать именно то, что вы ищете.http://linux.die.net/man/1/ack
Вы можете игнорировать
-i
поиск с учетом регистраисточник
Все предыдущие ответы предлагают grep и find. Но есть и другой способ: использовать Midnight Commander
Это бесплатная утилита (30 лет, проверенная временем), которая работает без графического интерфейса. У этого есть тонны функций, и поиск файлов - только одна из них.
источник
Команда ниже будет хорошо работать для этого подхода:
источник
find
и тогдаgrep -r
? Они предназначены для одного и того же, так что это избыточно.find
.Избегайте хлопот и установите ack-grep. Это устраняет много проблем с разрешениями и цитатами.
Затем перейдите в каталог, который вы хотите найти и выполните команду ниже
источник