Дополнительно
Как найти все файлы, содержащие определенный текст, в Linux?
Я'пытаюсь найти способ просканировать всю мою систему Linux на наличие всех файлов, содержащих определенную строку текста. Чтобы уточнить, я ищу текст внутри файла, а не в имени файла.
Когда я искал, как это сделать, я дважды наткнулся на это решение:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Однако оно не работает. Кажется, что он отображает все файлы в системе.
Близок ли этот способ к правильному? Если нет, то как это сделать? Эта возможность находить текстовые строки в файлах была бы чрезвычайно полезна для некоторых проектов по программированию, которыми я занимаюсь.
4881
20
Сделайте следующее:
-r
или-R
- рекурсивный,-n
- номер строки, и-w
означает совпадение всего слова.-l
(строчная буква L) может быть добавлена, чтобы просто указать имя файла, с которым происходит совпадение.Наряду с этим, для эффективного поиска можно использовать флаги
--exclude
,--include
,--exclude-dir
:При этом поиск будет осуществляться только в тех файлах, которые имеют расширения .c или .h:
Это исключит поиск всех файлов, заканчивающихся расширением .o:
Для каталогов можно исключить определенный каталог (каталоги) с помощью параметра
--exclude-dir
. Например, это исключит каталоги dir1/, dir2/ и все из них, соответствующие *.dst/:Это очень хорошо работает для меня, чтобы достичь почти той же цели, что и ваша.
Для получения дополнительных опций проверьте
man grep
.Вы можете использовать
grep -ilR
:i
означает игнорировать регистр (в вашем случае необязательно).R
означает рекурсивный.l
означает "показывать имя файла, а не сам результат"./
означает начинать с корня вашей машины.Вы можете использовать ack. Это как grep для исходного кода. С его помощью можно просканировать всю файловую систему.
Просто сделайте:
В корневом каталоге.
Вы также можете использовать регулярные выражения, указывать тип файла и т.д.
ОБНОВЛЕНИЕ
Я только что обнаружил The Silver Searcher, который похож на ack, но в 3-5 раз быстрее его и даже игнорирует шаблоны из файла
.gitignore
.Вы можете использовать:
Символ
r
означает "рекурсивный", поэтому поиск будет производиться по указанному пути, а также в его подкаталогах. Это сообщит вам имя файла, а также выведет строку в файле, в которой встречается эта строка.Или команда, подобная той, которую вы пробуете (пример: ) для поиска во всех файлах javascript (*.js):
Это выведет строки в файлах, где появляется текст, но не выведет имя файла.
В дополнение к этой команде мы можем написать и следующее: grep -rn "Строка для поиска" /path/to/directory/or/file. -r: рекурсивный поиск n: номер строки будет показан для совпадений
Вы можете использовать это:
Список имен файлов, содержащих заданный текст
Во-первых, я полагаю, что вы использовали
-H
вместо-l
. Также вы можете попробовать добавить текст внутри кавычек, за которыми следует{} \
.Пример
Допустим, вы ищете файлы, содержащие определенный текст "Apache License" в вашей директории. Он выдаст результаты, похожие на приведенные ниже (вывод будет отличаться в зависимости от содержимого вашей директории).
Убрать чувствительность к регистру
Даже если вы не используете регистр, например, "text" против "TEXT", вы можете использовать переключатель
-i
, чтобы игнорировать регистр. Более подробную информацию вы можете прочитать здесь.Надеюсь, это вам поможет.
grep
(GNU или BSD)Вы можете использовать инструмент
grep
для рекурсивного поиска в текущей папке, например:Примечание:
-r
- рекурсивный поиск в подкаталогах.Вы также можете использовать синтаксис globbing для поиска в определенных файлах, например:
Примечание: При использовании опции globbing (
**
) выполняется рекурсивное сканирование всех файлов с определенным расширением или шаблоном. Чтобы включить этот синтаксис, выполните:shopt -s globstar
. Вы также можете использовать**/*.*
для всех файлов (исключая скрытые и без расширения) или любой другой шаблон.Если вы получили ошибку, что ваш аргумент слишком длинный, сузьте поиск или используйте синтаксис
find
, например:В качестве альтернативы используйте
ripgrep
.ripgrep
.Если вы работаете над большими проектами или большими файлами, вместо этого используйте
ripgrep
, например:Посмотрите документацию, шаги по установке или исходный код на странице проекта на GitHub.
Он намного быстрее, чем любой другой инструмент типа GNU/BSD
grep
,ucg
,ag
,sift
,ack
,pt
или подобных, поскольку он построен на основе движка regex Rust, который использует конечные автоматы, SIMD и агрессивные оптимизации литералов для очень быстрого поиска.Он поддерживает шаблоны игнорирования, указанные в файлах
.gitignore
, поэтому один путь к файлу может быть сопоставлен с несколькими шаблонами glob одновременно.Вы можете использовать такие общие параметры, как:
-i
- Нечувствительный поиск.-I
- Игнорировать бинарные файлы.-w
- Поиск целых слов (противоположно частичному подбору слов).-n
- Показать строку совпадения.-C
/--context
(например,-C5
) - Увеличивает контекст, так что вы видите окружающий код.--color=auto
- Пометить совпадающий текст.-H
- Отображает имя файла, в котором найден текст.-c
- Отображает количество совпадающих строк. Может комбинироваться с-H
.Если ваш
grep
не поддерживает рекурсивный поиск, вы можете комбинироватьfind
сxargs
:Мне кажется, это легче запомнить, чем формат для
find -exec
.Это выведет имя файла и содержимое найденной строки, например.
Необязательные флаги, которые вы можете добавить к
grep
:-i
- поиск без учета регистра.-l
- выводить только имя файла, в котором было найдено совпадение-h
- выводить только строку, в которой найдено совпадение (не имя файла)i
: Игнорировать различия регистра как в PATTERN, так и во входных файлах.n
: Префикс каждой строки вывода с номером строки на основе 1 в своем входном файле.s
: Подавлять сообщения об ошибках несуществующих или нечитаемых файлов.r
: Рекурсивно читать все файлы в каждом каталоге.При использовании find, как в вашем примере, лучше добавить
-s
(--no-messages
) кgrep
, и2>/dev/null
в конце команды, чтобы избежать множества Permission denied сообщений, выдаваемыхgrep
иfind
:find является стандартным инструментом для поиска файлов - в сочетании с grep при поиске определенного текста - на Unix-подобных платформах. Кстати, команда find часто сочетается с xargs.
Для этой же цели существуют более быстрые и простые инструменты - см. ниже. Лучше попробовать их, при условии, что они доступны на вашей платформе, конечно:
Более быстрые и простые альтернативы
RipGrep - самый быстрый инструмент поиска:
The Silver Searcher:
ack:
Примечание: Вы можете добавить
2>/dev/null
к этим командам, чтобы скрыть многие сообщения об ошибках.Предупреждение: если вы действительно не можете этого избежать, не ищите с '/' (корневой каталог), чтобы избежать долгого и неэффективного поиска! Поэтому в приведенных выше примерах лучше заменить '/' на имя подкаталога, например, "/home", в зависимости от того, где вы хотите искать....
Существует новая утилита под названием The Silversearcher.
Она тесно сотрудничает с Git и другими VCS. Поэтому вы не получите ничего в .git или другом каталоге.
Вы можете просто использовать
И он выполнит задачу за вас!
Используйте команду pwd для поиска из любого каталога, где вы находитесь, рекурсией вниз
Обновление В зависимости от версии грэп вы используете, вы можете опустить
дуо
. На новых версиях.
, кажется, по умолчанию для grep, если каталог не указывается таким образом:команда grep -rnw -е "по схеме"
вили
грэп -rnw-то "узор"
вбудет делать то же самое, что и выше!
Попробуйте:
команда grep
может использоваться, даже если мы'повторно не ищу строку.Просто работает,
выведет путь к все текстовые файлы, т. е. те, которые содержат только печатные символы.
Здесь представлены несколько список команд, которые можно использовать для поиска файлов.
Объяснение с комментариями
найти команду, которая позволяет найти файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы Don'т указать маску, что filesnames должны встретиться, он перечисляет все объекты каталога.
Серебряный поисковик-это потрясающий инструмент, но ripgrep может быть даже лучше.
Она работает на Linux, Mac и Windows, и была написана на Хакер Новости пару месяцев назад (это ссылка на Андрей галантный'с блога, который имеет GitHub ссылке):
Ripgrep – новый параметр командной строки инструмент поиска
Попробуйте:
который будет искать всех файловых системах, потому что
/
- корневая папка.Для домашнего использования папки:
Для текущего использования папки:
Надеюсь, что это помощь...
Расширение
команда grep
немного, чтобы дать больше информации в выходной, например, чтобы получить номер строки в файле, где текст может быть сделано следующим образом:И если у вас есть идея, какой тип файла вы можете сузить область поиска с помощью указания расширений типа файла для поиска в этом случае.ПА
или
.DFM-файлов`:Краткое описание варианта:
.
Внайти
указывается от текущего каталога.-имя в
"*.*
&я : для всех файлов ( -именем "*.пас в
" -О-именем "*.ДФМ в
" ) : только*.ПА
или*.файлы ПДФ, или указано с
-о `-тип F
указывает, что вы ищете файлы-print0 команды
и- нуль
с другой стороны|
(трубы) являются критическими, передавая имя изнайти
вкоманда grep
вкладывается вразмер
, что позволяет передачу файлов с пробелами в именах файлов, позволяя grep для лечения путь и имя файла в виде одной строки, а не разбить его на участки.Простой
найти
можете работать удобно. псевдоним его в ваш~/.файл bashrc`:Запуск нового терминала и вопрос: