Я хочу найти все файлы, содержащие определенную строку текста. Команда grep работает, но я не знаю, как ее использовать для каждого каталога (я могу сделать это только для моего текущего каталога). Я пробовал читать man grep, но это не помогло.
Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Лучше использовать
grep -rl "string" /path
, где опция
-r (или --recursive) используется для перемещения также всех подкаталогов /path , в то время как опция -l (или --files-with-matches) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, учитывая, что grep перестает читать файл в первом совпадении с этой опцией ).Если вы ищете соответствие строк в файлах, моя любимая команда:
grep -Hrn 'search term' path/to/files
-H заставляет печатать имя файла (подразумевается при поиске нескольких файлов) -r рекурсивный поиск -n приводит к тому, что номер строки будет напечатан path/to/files может быть . для поиска в текущем каталоге
Дополнительные параметры, которые я нахожу очень полезными: [ ! d6] -H заставляет печатать имя файла (подразумевается при поиске нескольких файлов) -F трактует search term как литерал, а не регулярное выражение -r делает рекурсивный поиск --color=always для создания цветов даже при прохождении через less. Чтобы сделать поддержку цветов less, вам необходимо использовать опцию -r:
-n заставляет напечатать номер строки grep -Hrn search . | less -r
Я полагаю, вы можете использовать что-то вроде этого:
find /path -type f -exec grep -l "string" {} \;
Объяснение из комментариев
find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.
-type f указывает, что она должна обрабатывать только файлы, а не каталоги и т. Д. [F4] указывает, что для каждого найденного файла , он должен запустить команду grep, передав ей имя файла в качестве аргумента, заменив {} на имя файлаМоя команда по умолчанию -
grep -Rin string *
Я использую capitol 'R', потому что ls использует его для рекурсивного. Поскольку grep принимает оба варианта, нет причин не использовать его.
EDIT: для HVNSweeting, по-видимому, -R будет следовать символическим ссылкам, где, как -r, не будет.
Если вы хотите попробовать что-то новое, дайте ack выстрел. Команда для рекурсивного поиска в текущем каталоге для string:
ack string
Установка довольно проста:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Если у вас уже есть каталог ~/bin ], и это желательно в вашем PATH.)
Команда rgrep предназначена для такой необходимости
Если она недоступна, вы можете получить ее так:
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
Вы можете напрямую установить в свои параметры grep по умолчанию, как описано выше .
I personnaly use
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
родственная тема: как всегда использовать rgrep с цветом
Обновление 2:
Эта строка команд с использованием find и grep устраняет проблему:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto> для цветного вывода:
$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
Пример:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Пример, выполняемый в снимок ниже:
Обновление 2:
Вы можете попробовать следующий код; как функция в ваших .bashrc или .bash_aliases или в скрипте:
wherein ()
{
for i in $(find "$1" -type f 2> /dev/null);
do
if grep --color=auto -i "$2" "$i" 2> /dev/null; then
echo -e "\033[0;32mFound in: $i \033[0m\n";
fi;
done
}
Использование: wherein /path/to/search/in/ searchkeyword
example:
$ wherein ~/Documents/ "hello world"
(Примечание: как было предложено в комментариях ниже @enzotib, это не работает с файлами / каталогами, включая пробелы в их именах.)
[d16 ] Оригинальная записьДля поиска строки и вывода этой строки с помощью строки поиска:
$ for i in $(find /path/of/target/directory -type f); do \
grep -i "the string to look for" "$i"; done
например:
$ for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
Чтобы отобразить имя файла содержащий строку поиска:
$ for i in $(find /path/of/target/directory -type f); do \
if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
например:
$ for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
Я делаю это с помощью xargs, очень недооцененной команды
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./ дает вам рекурсивный список всех файлов в текущей папке, затем вы передаете его в xargs, который выполняет команду grep на каждом из этих файлов
Я знаю, что здесь есть много ответов, но вот альтернатива, если вы хотите добавить другие ограничения при поиске файлов:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Это работает, потому что grep вернет 0, если он нашел результат, в противном случае. Например, вы можете найти файлы размером 1 МБ и что-то:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Для нескольких требований вы, вероятно, захотите использовать флаг оптимизатора -O, который существует в GNU grep.
Скрипт (find-in-code) для поиска в C, CPP-коде:
#!/bin/sh
find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"
Использование:
find-in-code "search string"
Вы можете использовать инструмент grep для поиска рекурсивно текущей папки с параметром -r, например:
grep -r "pattern" .
Примечание. : -r - Рекурсивно искать подкаталоги.
Для поиска в определенных файлах вы можете использовать синтаксис глобулизации, такой как:
grep "class foo" **/*.c
Примечание: -r - Рекурсивно искать подкаталоги.
Если у вас есть ошибка в том, что ваш аргумент слишком длинный, рассмотрите сужение поиска или используйте синтаксис find, а именно:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
В качестве альтернативы используйте синтаксис globbing .
Если вы работаете над большими проектами или большими файлы, вы должны использовать ripgrep, а именно:
rg "pattern" .
Оформить документы, шаги установки или исходный код на странице проекта GitHub.
Это намного быстрее, чем любые другие такие как GNU / BSD grep, ucg, ag, sift, ack, pt или аналогичные, поскольку он построен поверх механизма регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивный литерал оптимизация для поиска g!
Он поддерживает шаблоны игнорирования, указанные в файлах .gitignore, поэтому один путь к файлу может быть сопоставлен с несколькими шаблонами glob одновременно.
Вы можете использовать общие параметры, такие как:
-i - Нечувствительный поиск. -I - Игнорировать двоичные файлы. -w - поиск целых слов (в отличие от частичного совпадения слов). -n - показать строку вашего матча. -C / --context (например, -C5) - Увеличивает контекст, поэтому вы видите окружающий код. --color=auto - Пометьте соответствующий текст. -H - отображает имя файла, в котором найден текст. -c - отображает количество совпадающих строк. Может комбинироваться с -H.Команда rgrep предназначена для такой необходимости
Если она недоступна, вы можете получить ее так:
mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep
Вы можете напрямую установить в свои параметры grep по умолчанию, как описано выше .
I personnaly use
[[ ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"
родственная тема: как всегда использовать rgrep с цветом
Вы можете использовать инструмент grep для поиска рекурсивно текущей папки с параметром -r, например:
grep -r "pattern" .
Примечание. : -r - Рекурсивно искать подкаталоги.
Для поиска в определенных файлах вы можете использовать синтаксис глобулизации, такой как:
grep "class foo" **/*.c
Примечание: -r - Рекурсивно искать подкаталоги.
Если у вас есть ошибка в том, что ваш аргумент слишком длинный, рассмотрите сужение поиска или используйте синтаксис find, а именно:
find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'
В качестве альтернативы используйте синтаксис globbing .
Если вы работаете над большими проектами или большими файлы, вы должны использовать ripgrep, а именно:
rg "pattern" .
Оформить документы, шаги установки или исходный код на странице проекта GitHub.
Это намного быстрее, чем любые другие такие как GNU / BSD grep, ucg, ag, sift, ack, pt или аналогичные, поскольку он построен поверх механизма регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивный литерал оптимизация для поиска g!
Он поддерживает шаблоны игнорирования, указанные в файлах .gitignore, поэтому один путь к файлу может быть сопоставлен с несколькими шаблонами glob одновременно.
Вы можете использовать общие параметры, такие как:
-i - Нечувствительный поиск. -I - Игнорировать двоичные файлы. -w - поиск целых слов (в отличие от частичного совпадения слов). -n - показать строку вашего матча. -C / --context (например, -C5) - Увеличивает контекст, поэтому вы видите окружающий код. --color=auto - Пометьте соответствующий текст. -H - отображает имя файла, в котором найден текст. -c - отображает количество совпадающих строк. Может комбинироваться с -H.Если вы хотите попробовать что-то новое, дайте ack выстрел. Команда для рекурсивного поиска в текущем каталоге для string:
ack string
Установка довольно проста:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Если у вас уже есть каталог ~/bin ], и это желательно в вашем PATH.)
Я полагаю, вы можете использовать что-то вроде этого:
find /path -type f -exec grep -l "string" {} \;
Объяснение из комментариев
find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.
-type f указывает, что она должна обрабатывать только файлы, а не каталоги и т. Д. [F4] указывает, что для каждого найденного файла , он должен запустить команду grep, передав ей имя файла в качестве аргумента, заменив {} на имя файлаЕсли вы ищете соответствие строк в файлах, моя любимая команда:
grep -Hrn 'search term' path/to/files
-H заставляет печатать имя файла (подразумевается при поиске нескольких файлов) -r рекурсивный поиск -n приводит к тому, что номер строки будет напечатан path/to/files может быть . для поиска в текущем каталоге
Дополнительные параметры, которые я нахожу очень полезными: [ ! d6] -H заставляет печатать имя файла (подразумевается при поиске нескольких файлов) -F трактует search term как литерал, а не регулярное выражение -r делает рекурсивный поиск --color=always для создания цветов даже при прохождении через less. Чтобы сделать поддержку цветов less, вам необходимо использовать опцию -r: grep -Hrn search . | less -r
-n заставляет напечатать номер строки
Скрипт (find-in-code) для поиска в C, CPP-коде:
#!/bin/sh
find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"
Использование:
find-in-code "search string"
Обновление 2:
Эта строка команд с использованием find и grep устраняет проблему:
$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +
--color=<always or auto> для цветного вывода:
$ find path_to_search_in -type f \
-exec grep --color=always -in searchString {} 2>/dev/null +
Пример:
$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +
Пример, выполняемый в снимок ниже:
Обновление 2:
Вы можете попробовать следующий код; как функция в ваших .bashrc или .bash_aliases или в скрипте:
wherein ()
{
for i in $(find "$1" -type f 2> /dev/null);
do
if grep --color=auto -i "$2" "$i" 2> /dev/null; then
echo -e "\033[0;32mFound in: $i \033[0m\n";
fi;
done
}
Использование: wherein /path/to/search/in/ searchkeyword
example:
$ wherein ~/Documents/ "hello world"
(Примечание: как было предложено в комментариях ниже @enzotib, это не работает с файлами / каталогами, включая пробелы в их именах.)
Оригинальная запись
Для поиска строки и вывода этой строки с помощью строки поиска:
$ for i in $(find /path/of/target/directory -type f); do \
grep -i "the string to look for" "$i"; done
например:
$ for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done
Чтобы отобразить имя файла содержащий строку поиска:
$ for i in $(find /path/of/target/directory -type f); do \
if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;
например:
$ for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;
Моя команда по умолчанию -
grep -Rin string *
Я использую capitol 'R', потому что ls использует его для рекурсивного. Поскольку grep принимает оба варианта, нет причин не использовать его.
EDIT: для HVNSweeting, по-видимому, -R будет следовать символическим ссылкам, где, как -r, не будет.
Я знаю, что здесь есть много ответов, но вот альтернатива, если вы хотите добавить другие ограничения при поиске файлов:
find . -type f -exec grep --quiet string_to_look_for {} ';' -print
Это работает, потому что grep вернет 0, если он нашел результат, в противном случае. Например, вы можете найти файлы размером 1 МБ и что-то:
find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print
Для нескольких требований вы, вероятно, захотите использовать флаг оптимизатора -O, который существует в GNU grep.
Я делаю это с помощью xargs, очень недооцененной команды
find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'
find ./ дает вам рекурсивный список всех файлов в текущей папке, затем вы передаете его в xargs, который выполняет команду grep на каждом из этих файлов
Если вы хотите попробовать что-то новое, дайте ack выстрел. Команда для рекурсивного поиска в текущем каталоге для string:
ack string
Установка довольно проста:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(Если у вас уже есть каталог ~/bin ], и это желательно в вашем PATH.)
Я полагаю, вы можете использовать что-то вроде этого:
find /path -type f -exec grep -l "string" {} \;
Объяснение из комментариев
find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.
-type f указывает, что она должна обрабатывать только файлы, а не каталоги и т. Д. [F4] указывает, что для каждого найденного файла , он должен запустить команду grep, передав ей имя файла в качестве аргумента, заменив {} на имя файла