Список имен функций с помощью grep [duplicate]

Если я правильно понял ваш вопрос, вы хотите построить две вещи на одном и том же axes без совместного доступа axis. Вероятно, есть лучший способ сделать это, но вы можете установить twinx (doc) и twiny (doc) как таковые

ax # your first axes
ax_new = ax.twinx().twiny()

Который даст вам отметки по всем сторонам сюжета. ax будет зависеть от нижней и левой сторон, ax_new будет зависеть от верхнего и правого.

3717
задан Peter Mortensen 21 May 2017 в 11:40
поделиться

23 ответа

Выполните следующие действия:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r или -R рекурсивно,
  • -n - номер строки, а
  • -w означает совпадение всего слова.
  • -l (нижний регистр L) можно добавить, чтобы просто указать имя файла совпадающих файлов.

Наряду с этим, --exclude, --include, --exclude-dir могут использоваться для эффективного поиска:

  • Это будет поиск только тех файлов, которые имеют .c или .h расширения:
    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • исключает поиск всех файлов, заканчивающихся расширением .o:
    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • Для каталогов можно исключить конкретный каталог (ы) через параметр --exclude-dir. Например, это исключает dirs dir1 /, dir2 / и все из них, соответствующие * .dst /:
    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

. Это очень хорошо работает для меня, для достижения почти той же цели как ваш.

Для получения дополнительных опций проверьте man grep.

6730
ответ дан rakib_ 17 August 2018 в 09:06
поделиться
  • 1
    используйте --exclude. подобный "grep -rnw --exclude = *. o 'directory' -e" pattern " – rakib_ 6 June 2013 в 09:29
  • 2
    Я считаю, что параметр grep'sinclude очень полезен. Например: grep -rnw --include = *. Java. -e "что бы я ни искал" – Lucas A. 14 November 2013 в 17:43
  • 3
    стоит отметить: кажется, что параметр r ленив (проходит сначала по глубине, чем останавливается после первого каталога), а R - жадный (правильно пересекает все дерево). – Eliran Malka 24 March 2015 в 16:09
  • 4
    Примечание (особенно для новичков): Кавычки в приведенной выше команде важны. – madD7 22 December 2015 в 13:37
  • 5
    @Eliran Malka R ru r будет правильно перемещать каталоги, но R будет следовать символическим ссылкам. – bzeaman 5 July 2016 в 08:36

Ниже приведен список команд, которые можно использовать для поиска файла.

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path
14
ответ дан Atul Arvind 17 August 2018 в 09:06
поделиться

Как найти все файлы, содержащие определенный текст в Linux? (...)

Я встретил это решение дважды:

find / -type f -exec grep -H 'text-to-find-here' {} \;


Если вы используете find , как в вашем примере, лучше добавьте -s (--no-messages) в grep и 2>/dev/null в конце команды, чтобы избежать большого количества сообщений g8] Permission denied , выпущенных grep и find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

find - стандартный инструмент для поиска файлов - в сочетании с grep при поиске определенного текста - на Unix-подобных платформах. Команда find часто сочетается с xargs , между прочим.

Быстрые и простые инструменты существуют с той же целью - см. Ниже. Лучше попробуйте их, , если они доступны на вашей платформе , конечно:

Более быстрые и простые альтернативы

RipGrep - самый быстрый инструмент поиска вокруг:

rg 'text-to-find-here' / -l

Серебряный Searcher :

ag 'text-to-find-here' / -l

ack :

ack 'text-to-find-here' / -l

Примечание: вы также можете добавить 2>/dev/null к этим командам, чтобы скрыть много сообщений об ошибках.


Предупреждение: , если вы действительно не можете этого избежать, 't искать из ' / '(корневой каталог) , чтобы избежать длительного и неэффективного поиска! Поэтому в приведенных выше примерах вам лучше заменить '/' на имя подкаталога, например. «/ home» в зависимости от того, где вы действительно хотите искать ...

12
ответ дан Bludzee 17 August 2018 в 09:06
поделиться
  • 1
    'find - стандартный инструмент для поиска файлов, содержащих определенный текст на Unix-подобных платформах. кажется мне довольно неоднозначным. Даже если рекурсивный grep find не выполняет прямой поиск внутри файлов для текста. И, возможно, эти дополнительные инструменты полезны для некоторых, но старых таймеров, и те, кто хорошо привыкли к, например, grep не дал бы им вообще никакого времени (ну я, конечно, не буду). Не сказать, что они бесполезны. – Pryftan 1 May 2018 в 23:36
  • 2
    & quot; .... содержащий конкретный текст ... & quot; : эта часть предложения не была точной (потому что она не обнаруживает, что касается этой части поиска). Ред. Благодарю. – Bludzee 1 June 2018 в 09:21
  • 3
    Рад помочь! Единственное, что очень быстрый взгляд - это изменить слово folder на каталог , но я знаю, что это мой крестовый поход, я никогда не выиграю полностью. Не сдаваться, хотя ... – Pryftan 1 June 2018 в 16:13
  • 4
    Почему не "каталог" вместо «папки», но почему? Пожалуйста, поделитесь своим «крестовым походом». ! – Bludzee 1 June 2018 в 17:00
  • 5
    Согласовано. Готово. (Я удалю мои комментарии, так как они теперь устарели). Спасибо за предложение – Bludzee 2 June 2018 в 17:24

Существует инструмент ack, который будет делать именно то, что вы ищете.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

Вы можете игнорировать -i для поиска с учетом регистра

7
ответ дан Daniel 17 August 2018 в 09:06
поделиться
  • 1
    Что это добавляет к существующим ответам? Это было предложено уже более трех лет назад. – fedorqui 2 December 2016 в 14:20
  • 2
    @fedorqui 1) нет трубопроводов! 2) Использовать регулярные выражения. 3) Получить номера строк, имя файла с относительным путем, выделенный текст и т. Д., Полезные для редактирования после поиска, например, vim + lineno path / file.cpp & quot; вы получите прямо на линии, которая не представляет интереса. См. Вывод команды & quot; ack include \ | hpp & quot; который ищет "включить" или "hpp" ключевые слова в моей папке поиска и вложенных папках. Надеюсь, что это ясно. Вот пример вывода (невозможно показать ключевые моменты с простым текстом) process / child.hpp 11: boost / process / child.hpp process / all.hpp 21: #include & lt; boost / process / execute.hpp & gt; – Pal 11 July 2017 в 15:57

Если у вас есть набор файлов, которые вы всегда будете проверять, вы можете псевдонимы их путей, например:

alias fd='find . -type f -regex ".*\.\(inc\|info\|module\|php\|test\|install\|uninstall\)"'

Затем вы можете просто отфильтровать список следующим образом:

grep -U -l $'\015' $(fd)

Отфильтровывает список fd для файлов, содержащих шаблон CR.

Я нахожу, что наложение файлов, которые меня интересуют, помогает мне создавать более простые скрипты, а затем всегда пытается вспомнить, как получить все эти файлы. Рекурсивный материал работает, но рано или поздно вам придется бороться с отсечением определенных типов файлов. Именно поэтому я просто нахожу все типы файлов, которые мне интересны для начала.

6
ответ дан dkinzer 17 August 2018 в 09:06
поделиться
grep -insr "pattern" *
  • i: игнорировать различия в событиях как в PATTERN, так и в входных файлах.
  • n: префикс каждой строки вывода с номером строки на основе 1 в его входной файл.
  • s: Подавлять сообщения об ошибках о несуществующих или нечитаемых файлах.
  • r: рекурсивно читать все файлы под каждым каталогом.
34
ответ дан Fabio Poloni 17 August 2018 в 09:06
поделиться
  • 1
    Можете ли вы объяснить, как ваш ответ улучшается при других ответах или насколько он в значительной степени отличается от них? – Amos M. Carpenter 26 February 2016 в 07:10
  • 2
    не слишком сложный для запоминания, будет охватывать все шаблоны (case-senstivity - & gt; off, включает имена файлов и номер строки и будет выполнять рекурсивный поиск и т. д.) и с использованием & quot; * & quot; в конце будет искать все каталоги (нет необходимости указывать путь или имя каталога). – enfinet 26 February 2016 в 07:15
  • 3
    Извините, я должен был быть более ясным: было бы здорово, если бы вы могли включить это объяснение в свой ответ. Как и в случае с этим, особенно с таким количеством других подобных ответов, трудно понять из такого короткого ответа, что польза от попыток it по принятому ответу или одному из вышеперечисленных. – Amos M. Carpenter 26 February 2016 в 07:35
  • 4
    Это хороший ответ + хорошее объяснение – khelili miliana 22 September 2016 в 13:45
  • 5
    @ AmosM.Carpenter Одна вещь, которую мне нравится в этом ответе, указывает на аргумент suppress, который может помочь отфильтровать шум, который не имеет значения для получения желаемых результатов. Grep печатает такие ошибки, как «Функция не реализована», «Недопустимый аргумент», «Ресурс недоступен» и т. Д. И т. Д. В некоторых «файлах». – leetNightshade 20 February 2017 в 06:58

Вы можете использовать grep -ilR:

grep -Ril "text-to-find-here" /
  • i означает случай игнорирования (необязательно в вашем случае).
  • R означает рекурсивный.
  • l означает «показать имя файла, а не сам результат».
  • / означает начало в корне вашей машины.
1091
ответ дан fedorqui 17 August 2018 в 09:06
поделиться
  • 1
    Основываясь на моем опыте, -i заставляет его замедлять много, поэтому не используйте его, если это не необходимо. Протестируйте его в определенном каталоге, а затем обобщите. Он должен быть завершен в течение нескольких минут. Я думаю, что регулярное выражение сделает его медленнее. Но мои комментарии основаны на предположениях, я предлагаю вам проверить его с помощью time перед линией. – fedorqui 6 June 2013 в 09:14
  • 2
    Да, /* означает это. В любом случае, я просто протестировал его и заметил, что работает только /. – fedorqui 6 June 2013 в 09:15
  • 3
    Если вы не используете регулярное выражение, вы можете использовать fgrep вместо grep для большинства систем. – markle976 28 September 2013 в 15:49
  • 4
    Да @ markle976, на самом деле от человека grep: fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings. – fedorqui 30 September 2013 в 09:23
  • 5
    Вы можете заменить / на путь в каталог grep -Ril "text-to-find-here" ~/sites/ или использовать. для текущего каталога grep -Ril "text-to-find-here" . – Black 28 January 2016 в 13:19
grep -Erni + "text you wanna search"

Команда будет искать рекурсивно во всех файлах и каталогах текущего каталога и печатать результат.

Примечание: если ваш выход grep не окрашен, вы можете изменить его, используя grep = 'grep --color = always' alias в вашем файле src оболочки

6
ответ дан il_raffa 17 August 2018 в 09:06
поделиться
  • 1
    Вы можете указать, что -i делает поиск нечувствительным к регистру; по умолчанию у него нет этого - и не должно быть, поскольку Unix (и т. д.) не является регистро-независимой ОС. Вы также можете указать, для чего нужны другие параметры. – Pryftan 2 June 2018 в 01:31
find /path -type f -exec grep -l "string" {} \;

Объяснение из комментариев

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

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename
12
ответ дан JuanZe 17 August 2018 в 09:06
поделиться

Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.

apt-get install ack-grep

Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже

cd /
ack-grep "find my keyword"
7
ответ дан Kareem 17 August 2018 в 09:06
поделиться

Попробуйте:

find / -type f -exec grep -H 'text-to-find-here' {} \;

, который будет искать все файловые системы, потому что / является корневой папкой.

Для использования домашней папки:

find ~/ -type f -exec grep -H 'text-to-find-here' {} \;

Для использования текущей папки:

find ./ -type f -exec grep -H 'text-to-find-here' {} \;
29
ответ дан kenorb 17 August 2018 в 09:06
поделиться
  • 1
    Это на самом деле яркий пример того, когда НЕ использовать 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 соответствовал файлу WRONG и НЕ соответствовал предполагаемому файлу. Либо используйте find .. -print0 | xargs -0 ..., но это бесполезное использование трубы или лучше find ... -exec grep ... {} + – shalomb 11 October 2016 в 20:10
  • 2
    Возможно, подробности о различиях в папках очевидны для многих ... но также очень полезны для новичков. +1 – nilon 17 October 2016 в 18:07
  • 3
    что это добавляет к существующим ответам? – fedorqui 2 December 2016 в 14:16
  • 4
    Я также считаю, что расширенный глобус полезен. Но имейте в виду, что если действительно существует огромное количество файлов, вы можете слишком долго получить список «Аргумент». ошибка. (Простой глобус также подвержен такой ошибке). – Yoory N. 30 November 2017 в 07:47
  • 5
    Назовите это моим крестовым походом, но слово «каталог». Это не Windows (которая раньше использовала «каталог» - pre 9x). Пожалуйста, прекратите говорить «папка». Что касается вашей последней команды, вам даже не нужен «/» только FYI. – Pryftan 1 May 2018 в 23:12

Список имен файлов, содержащих заданный текст

Прежде всего, я считаю, что вы использовали -H вместо -l.

find / -type f -exec grep -l "text-to-find-here" {} \; 

Пример

Предположим, вы ищете файлы, содержащие определенный текст «Apache License» внутри вашего каталога ,

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Удалить чувствительность к регистру

Даже если вы не используете случай, подобный тому, который указан ниже (вывод будет отличаться в зависимости от вашего содержимого каталога). «text» vs «TEXT», вы можете использовать переключатель -i, чтобы игнорировать регистр. Подробнее вы можете прочитать здесь .

Надеюсь, это вам поможет.

50
ответ дан lkamal 17 August 2018 в 09:06
поделиться
  • 1
    OP запросил файлы, содержащие текст в своем содержании, а не имя файла. – Auxiliary 24 December 2014 в 04:16
  • 2
    Это то, что делает эта команда: find передаст все пути, которые он обнаружит, к команде grep -l "text-to-find-here" <file found>". Вы можете добавить ограничения на имя файла, например. find / -iname "*.txt" для поиска только в файлах, имя которых заканчивается на .txt – Mene 20 April 2017 в 13:46
  • 3
    @Auxiliary - включил образец вывода, чтобы избежать путаницы для читателей. – lkamal 7 October 2017 в 05:56
  • 4
    @Mene Это поистине печальное состояние, когда комментарий Auxiliary имеет больше голосов, чем ваш ... даже если их комментарий с 2014 года, а ваш 2017, что их комментарий имеет 6, когда он должен иметь ровно 0, а у вас только один (сейчас два) isn Я бы хотел поверить. – Pryftan 1 May 2018 в 23:01
  • 5
    @Mene. Говоря, что -iname нечувствителен к регистру, что означает, что он также найдет файлы .TXT, а также TxT и TXt и так далее. – Pryftan 1 May 2018 в 23:04

Используйте pwd для поиска из любого каталога, в котором вы находитесь, рекурсия вниз

grep -rnw `pwd` -e "pattern"

Обновление. В зависимости от используемой вами версии grep вы можете опустить pwd. В более новых версиях ., по-видимому, является аргументом по умолчанию для grep, если каталог не указан таким образом:

grep -rnw -e "pattern"

или

grep -rnw "pattern"

будет делать то же, что и выше!

23
ответ дан mahatmanich 17 August 2018 в 09:06
поделиться
  • 1
    использование pwd вообще не требуется, поскольку оно является значением по умолчанию. grep -rnw "pattern". – fedorqui 2 December 2016 в 14:17
  • 2
    и на самом деле grep -rnw и тому подобное было отвечено, как три года назад, я не вижу, как этот ответ добавляет ценность. – fedorqui 2 December 2016 в 15:03
  • 3
    Выбранный ответ не показывает шаблон по умолчанию, и 5 человек, похоже, нашли его полезным – mahatmanich 14 December 2016 в 09:27
  • 4
    Что вы имеете в виду с шаблоном по умолчанию ?? В принятом ответе содержится grep -rnw '/path/to/somewhere/' -e "pattern", что и есть здесь. 5 голосов после посещений 2.3M это не так много. – fedorqui 14 December 2016 в 09:45
  • 5
    Я согласен с тем, что :-) то, чего я отсутствовал в исходном ответе, - это вариант использования, который вам не нужно давать вообще, или искать рекурсивно текущий каталог, который не отражен в принятом ответе. Таким образом, это был хороший опыт изучения grep, чтобы копать немного глубже. – mahatmanich 14 December 2016 в 15:05

Меня увлекает то, как простой grep делает это с помощью 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Используйте '-r' без 'l', чтобы увидеть имена файлов, за которыми следует текст, в котором шаблон

grep -r 'pattern_to_find' /path/where/to/find

Работает просто отлично ..

Надеюсь, что это поможет!

7
ответ дан nitinr708 17 August 2018 в 09:06
поделиться

Нижеприведенная команда отлично подходит для этого подхода:

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;
23
ответ дан Peter Mortensen 17 August 2018 в 09:06
поделиться
  • 1
    в чем смысл использования find, а затем grep -r? Они предназначены для одного и того же, поэтому это избыточно. – fedorqui 23 December 2015 в 18:02
  • 2
    ооо !! исправлено, На самом деле find для запуска grep на отфильтрованных файлах и не всех, спасибо – Pradeep Goswami 30 December 2015 в 16:25
  • 3
    ag является удивительным. Должно быть. – fmquaglia 27 November 2016 в 15:11
  • 4
    Я не вижу, как это лучше, чем использование только ls или find (для рекурсивного) – fedorqui 2 December 2016 в 14:15
  • 5
    тем не менее, это не имеет никакого смысла, вы можете фильтровать с помощью find. – fedorqui 4 December 2016 в 00:00
  • 6
    -name '*.*' не то, что вы говорите; он не забирает файл под названием «файл», потому что шаблон не соответствует этому (нет .ext); *, однако (в порядке). Но есть еще одна вещь: если вы хотите, чтобы все файлы, зачем нужно указывать имя файла в первую очередь? Никаких других комментариев - кроме того, что приятно знать, что все еще есть люди, которые не используют папку MS терминологии (которая действительно после того, как я сказал это достаточно, я бы не добавил, но я хотел бы указать немного неправильное заявление, которое вы сделали с именами файлов, а также избыточность / бесполезность в случае «всего»). – Pryftan 1 May 2018 в 23:25

grep - ваш хороший друг для достижения этого.

grep -r <text_fo_find> <directory>

, если вам не нужен случай поиска текста, используйте

grep -ir <text_to_find> <directory>
8
ответ дан Prash 17 August 2018 в 09:06
поделиться
  • 1
    В моем случае это выглядит так, как будто он ищет везде, даже если я укажу каталог – Pathros 20 March 2018 в 17:30
  • 2
    @Pathros Вероятно, чтобы включить рекурсию и какой каталог вы указали. Другими словами, рекурсия меняет вещи таким образом. – Pryftan 1 May 2018 в 23:38
  • 3
    @Pathros Oh, и если в строке поиска есть - s, вам нужно сначала передать -- в grep; что может вызвать интересные побочные эффекты в противном случае! – Pryftan 2 June 2018 в 00:25

Вы можете использовать ack . Это похоже на grep для исходного кода.

Просто выполните:

ack 'text-to-find-here'

В корневом каталоге.

Вы также можете использовать regular выражения , укажите тип файла и т. д.


UPDATE

Я только что открыл Silver Searcher , который похож на ack, но 3 -5x быстрее, чем он, и даже игнорирует шаблоны из файла .gitignore.

240
ответ дан RAJ 17 August 2018 в 09:06
поделиться
  • 1
    Очень полезно, просто и быстро. Предупреждение: «В дистрибутивах, входящих в Debian, ack упаковывается как« ack-grep ». потому что "ack" уже существует & quot; (из beyondgrep.com/install ). Вы можете запустить конвертер кода Kanji на этих Linux ... – Jose_GD 20 September 2013 в 14:32
  • 2
    ack или ack-grep имеют приятные блики, но find + grep, когда правильное использование намного лучше в производительности – Sławomir Lenart 11 February 2015 в 10:00
  • 3
    Обратите внимание, что ripgrep быстрее, чем что-либо еще упомянутое здесь, включая Silver Searcher и plain 'ol grep. См. это сообщение в блоге для доказательства. – Radon Rosborough 14 October 2017 в 04:01

Если ваш grep не поддерживает рекурсивный поиск, вы можете комбинировать find с xargs:

find / -type f | xargs grep 'text-to-find-here'

Мне это легче запомнить, чем формат для find -exec.

Это приведет к отображению имени файла и содержимого соответствующей строки, например

/home/rob/file:text-to-find-here

Дополнительные флаги, которые вы можете добавить к grep:

  • -i - нечувствительный к регистру поиск
  • -l - выводит только имя файла, в котором было найдено совпадение
  • -h - выводить только строку, которая соответствует (не filename)
47
ответ дан RobEarl 17 August 2018 в 09:06
поделиться
  • 1
    Это эквивалентно grep 'text-to-find-here' без имени файла, если find ничего не находит. Это будет зависать и ждать ввода пользователя! Добавьте --no-run-if-empty в качестве опции в xargs. – hagello 28 January 2016 в 06:46
  • 2
    Эта комбинация find и xargs не работает так, как предполагалось, если имена файлов или каталогов содержат пробелы (символы, которые xargs интерпретирует как разделители). Используйте find … -exec grep … +. Если вы настаиваете на использовании find вместе с xargs, используйте -print0 и -0. – hagello 28 January 2016 в 06:50

Вы можете использовать это:

grep -inr "Text" folder/to/be/searched/
83
ответ дан Sudipta 17 August 2018 в 09:06
поделиться
  • 1
    простой, многословный, рекурсивный и нечувствительный к регистру. пальцы вверх. – Francesco Casula 9 April 2015 в 12:44
  • 2
    если вы добавите -A3 еще лучше – albanx 24 February 2016 в 11:43
  • 3
    Это очень здорово. – kodmanyagha 10 May 2017 в 13:12

Для поиска строки и вывода этой строки с помощью строки поиска:

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;
9
ответ дан user 17 August 2018 в 09:06
поделиться
  • 1
    Я вижу только недостаток по сравнению с использованием find … -exec grep 'str' {} \; (если вам вообще нужно использовать find). – phk 7 October 2016 в 16:14
  • 2
    Это могло бы нарушить ужасно, если бы какой-либо из файлов, найденных в find, содержал пробелы .. вы могли бы закончить grepping неправильные файлы и / или пропустить нужные файлы в целом. Просто используйте find ... -exec grep ..., если вам нужно использовать find .., но в этом случае достаточно grep -r .... – shalomb 11 October 2016 в 20:19
  • 3
    какова точка использования цикла по результатам поиска, а затем grep? Это становится излишне сложным. – fedorqui 2 December 2016 в 14:17

Вы можете использовать:

grep -r "string to be searched"  /path/to/dir

r означает рекурсивный поиск, поэтому он будет искать в указанном пути, а также в его подкаталогах. Это скажет вам имя файла, а также распечатает строку в файле, где отображается строка.

Или команда, аналогичная той, которую вы пытаетесь (пример:) для поиска во всех файлах javascript ( * .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Это будет печатать строки в файлах, где отображается текст, но не печатает имя файла.

В дополнение к этой команде, мы также можем написать это: grep -rn «String to search» / path / to / directory / or / file -r: рекурсивный поиск n: номер строки будет отображаться для совпадений

126
ответ дан Vivek Ranjan 17 August 2018 в 09:06
поделиться
  • 1
    Thanx для поиска. Моя версия grep (busybox для NAS) не имеет опции -r, мне действительно нужно другое решение! – j.c 2 September 2016 в 10:34
  • 2
    Спасибо за версию «найти»! Очень важно иметь возможность фильтровать « .js» или « .txt» и т. Д. Никто не хочет тратить часы, ожидая, когда grep завершит поиск всех видеороликов с несколькими гигабайтами из последней семьи отпуск, даже если команда легче набирать. – mightypile 16 August 2017 в 15:10

Попробуйте:

find . -name "*.txt" | xargs grep -i "text_pattern"
29
ответ дан kenorb 17 August 2018 в 09:06
поделиться
  • 1
    Это на самом деле яркий пример того, когда НЕ использовать 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 соответствовал файлу WRONG и НЕ соответствовал предполагаемому файлу. Либо используйте find .. -print0 | xargs -0 ..., но это бесполезное использование трубы или лучше find ... -exec grep ... {} + – shalomb 11 October 2016 в 20:10
  • 2
    Я также считаю, что расширенный глобус полезен. Но имейте в виду, что если действительно существует огромное количество файлов, вы можете слишком долго получить список «Аргумент». ошибка. (Простой глобус также подвержен такой ошибке). – Yoory N. 30 November 2017 в 07:47

Использование:

grep -c Your_Pattern *

Это сообщит, сколько копий вашего шаблона присутствует в каждом из файлов в текущем каталоге.

23
ответ дан Peter Mortensen 17 August 2018 в 09:06
поделиться
  • 1
    ag является удивительным. Должно быть. – fmquaglia 27 November 2016 в 15:11
  • 2
    Я не вижу, как это лучше, чем использование только ls или find (для рекурсивного) – fedorqui 2 December 2016 в 14:15
  • 3
    -name '*.*' не то, что вы говорите; он не забирает файл под названием «файл», потому что шаблон не соответствует этому (нет .ext); *, однако (в порядке). Но есть еще одна вещь: если вы хотите, чтобы все файлы, зачем нужно указывать имя файла в первую очередь? Никаких других комментариев - кроме того, что приятно знать, что все еще есть люди, которые не используют папку MS терминологии (которая действительно после того, как я сказал это достаточно, я бы не добавил, но я хотел бы указать немного неправильное заявление, которое вы сделали с именами файлов, а также избыточность / бесполезность в случае «всего»). – Pryftan 1 May 2018 в 23:25
Другие вопросы по тегам:

Похожие вопросы: