Перерахуйте файли, що містять певне слово в їх тексті


30

Я хотів би перерахувати файли рекурсивно та унікально, що містять задане слово.

Приклад : Перевіряючи слово "перевірити", я звичайно роблю греп

$ grep check * -R

Але оскільки цього слова багато, я отримую багато результатів. Тому мені просто потрібно перерахувати назви файлів, які містять задане пошукове слово. Я здогадуюсь про якийсь трюк, findі xargsцього вистачить, але не впевнений.

Будь-які ідеї?

Відповіді:


39

Використовуйте -lабо --files-with-matchesваріант, який задокументований так:

Придушити нормальний вихід; замість цього надрукуйте ім'я кожного вхідного файлу, з якого зазвичай було б надруковано вихід. Сканування припиниться при першій відповідності. ( -lвказано POSIX.)

Отже, для вашого прикладу ви можете використовувати наступне:

$ grep check * -lR

Працює і на MSYS. Чудово!
Кос

2
Я використовував, grep -rl "text to find" "/usr/share"і це чудово працювало!
Shrout1

18
find . -type f -exec grep -l check {} +

Напевно, ви не хочете використовувати -Rопцію, яка в сучасних версіях GNU grepдотримується символьних посилань при зменшенні каталогів. -rЗамість цього скористайтеся опцією, яка з версії 2.12 (квітень 2012) більше не відповідає посиланням.

Якщо ваш греп не є GNU, або старший за версію 2.12, або якщо вам потрібно, щоб ваш код був переносним для систем, що не мають крайніх кросівок, скористайтеся findкомандою вище.

В іншому випадку ви можете:

grep -rl check .

Не використовуйте *(так як це буде опускати приховані файли в поточному каталозі (і лише в поточному каталозі), і це спричинить проблеми для файлів, ім'я яких починається з а -), уникайте передачі параметрів після аргументів, оскільки це не гарантовано працює залежно від навколишнього середовища і не є портативним.


1

Спробуйте це:

find . -type f | xargs grep -c check $1 | grep -v ":0"

Щодо grepпрапорів ...

-c поверне ім'я файлу, після чого: і число, яке вказує, скільки разів рядок пошуку з’являється у заданому файлі.

-vвізьме вихід із першого grepпошуку, відфільтрує файли з нульовими результатами та виведе лише файли з ненульовими результатами.


Це отримає помилковий мінус, якщо у вас є файли (файли) (або режисер (и)), імена яких містять :0. Краще робити grep -v ':0$'. Навіть це задихнеться від імен шляхів, які містять новий рядок.
Скотт

0

grep -rin "whatToFind" locationToFInd

напр. $ grep -rin "vihaan".

буде рекурсивно шукати та списувати назви файлів та відповідні рядки, які містять у собі "vihaan", ". відноситься до поточного каталогу.



0

grep -lR "text-to-find" <where-to-find> також чудово працює.

наприклад, grep -lR "NAVIGATE" .де ми знаходимо слово NAVIGATEв .поточному каталозі.


-2
 grep -rli trim \` find . -name *.q \` 

Надайте вам список .qфайлів, що містить ключове словоtrim

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.