Як я можу використовувати grep, щоб знайти слово всередині папки?


542

У Windows я би здійснив пошук пошуку слова в папці. Так само я хочу знати, чи виникає певне слово всередині каталогу, що містить багато підкаталогів та файлів. Мій пошук синтаксису grep показує, що я повинен вказати ім'я файлу, тобто grep string filename.

Тепер я не знаю імені файлу, і що мені робити? Друг запропонував зробити grep -nr string, але я не знаю, що це означає, і я не отримав з цим результатів (відповіді немає, поки я не видам ctrl + c).

Відповіді:


848
grep -nr 'yourString*' .

Точка в кінці шукає поточний каталог. Значення для кожного параметра:

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . (Було б знайти MobileAppServlet.javaчи MobileAppServlet.classабо MobileAppServlet.txt; 'MobileAppASer*.*'- це ще один спосіб зробити те ж саме.)

Щоб перевірити більше параметрів, використовуйте команду man grep .


14
З чим справа *? Це або призведе до розширення шаблону підстановки (якщо є назви файлів, що відповідають шаблону підстановки), або grep сприйме це як оператор повторення 0 або більше для символу, що передує *.
уста

7
Тепер давайте розглянемо обидві можливості grep -nr MobileAppSer* .1. Припустимо , у нас є 3 файлів в поточному каталозі відповідності MobileAppSer*шаблоном: по імені MobileAppServlet.java, MobileAppServlet.class, MobileAppServlet.txt. Тоді grepбуде викликаний наступним чином: grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt .. Це означає пошук тексту "MobileAppServlet.class" у файлах MobileAppServlet.java, MobileAppServlet.txt та інших місцях у поточному каталозі - що тут точно не те, що користувач хоче тут.
уста

7
2. Якщо в поточному каталозі немає файлів, що відповідають MobileAppSer*шаблону підстановки, grepвін отримає аргумент MobileAppSer*як-є і, таким чином, візьме його як пошук тексту "MobileAppSe" з подальшим 0 або більше входженням "r", так що це буде спроба знайти тексти "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr" тощо у вмісті файлів поточного каталогу - не те, що бажає користувач.
уста

5
Це сумнівний вибір регексу. Уста це вказав.
видпростий

117
grep -nr string my_directory

Додаткові зауваження: це задовольняє синтаксис, grep [options] string filenameоскільки в системах, схожих на Unix, каталог є своєрідним файлом (існує термін "звичайний файл", який конкретно позначає сутності, які в Windows називаються просто "файлами").

grep -nr string читає вміст для пошуку зі стандартного вводу, тому він просто чекає на вас введення від нього, і припиняє це робити, коли ви натискаєте ^ C (він зупиняється і на ^ D, що є комбінацією клавіш для закінчення -файл).


1
Гей, тому, якщо я хочу шукати рядок незалежно від випадку, я повинен це зробити: grep -i -nr "моє слово".
кікі

2
@kiki: Так, що еквівалентноgrep -inr "my word" .
USTA

16
@kiki: -rgrep означає пошук у підкаталогах рекурсивно і -nозначає приставку кожного рядка виводу з відповідним номером рядка файла, який містить цей рядок. man grepописує все це та багато іншого.
usta

62

GREP : Друк / Аналізатор / Процесор / Програма глобального регулярного вираження.
Ви можете використовувати це для пошуку в поточному каталозі.
Ви можете вказати -R для "рекурсивного", що означає, що програма здійснює пошук у всіх підпапках та їх підпапках, а також у підпапках їх підпапок тощо.

grep -R "your word" .

-nбуде надрукувати номер рядка, де він збігався у файлі.
-iздійснить пошук без урахування регістру (великих літер).

grep -inR "your regex pattern" .

3
./* означає всі файли в поточному каталозі, -R означає рекурсивний (пошук підкаталогів тощо)
Стефан Штайгер

25
grep -nr search_string search_dir

зробить RECURSIVE (маючи на увазі каталог та всі його підкаталоги) пошук у пошуковому рядку. (як правильно відповідає usta).

Причиною того, що ви не отримували жодних анурів із пропозицією свого друга:

grep -nr string

це тому, що не вказано жодного каталогу. Якщо ви знаходитесь в каталозі, в якому ви хочете здійснити пошук, вам потрібно зробити наступне:

grep -nr string .

Важливо включити "." символу, оскільки це говорить grep для пошуку цього каталогу.


Привіт, що мені робити, якщо мені потрібно шукати 2 слова з пробілом між ними? Чи слід вказувати слова в лапках? тобто grep -nr "моє слово".
кікі

24

Також є:

find directory_name -type f -print0 | xargs -0 grep -li word

але це може бути трохи для початківця.

findє прогулянкою / лістером загального призначення, -type fозначає "шукати звичайні файли, а не каталоги та іменовані труби та що у вас є", -print0означає "друкувати їх на стандартному виході, використовуючи нульові символи як роздільники". Вихід з даних findнадсилається до, xargs -0і він захоплює його стандартний вхід фрагментами (щоб уникнути обмежень довжини командного рядка), використовуючи нульові символи як роздільник записів (а не стандартний новий рядок) і застосовується grep -li wordдо кожного набору файлів. На grep, -lозначає "список файлів, які відповідають" і -iозначає "нечутливі до регістру"; зазвичай ви можете комбінувати варіанти одного символу, тому ви побачите -liїх частіше -l -i.

Якщо ви не використовуєте, -print0і -0тоді у вас виникнуть проблеми з іменами файлів, які містять пробіли, тому їх використання є доброю звичкою.


1
@mmmshuddup: Дякую Мені погано, якщо я не даю пояснень як частини відповіді, особливо коли працюю з новачком.
mu занадто короткий

1
Ось що я найбільше оцінив на цьому сайті. Важливо пам’ятати, що ми всі були колись початківцями, і нелегко з'явитися у світі технологій!
Так, Баррі

чи можу я виключити певні каталоги? @muistooshort
Ferologics

@Ferologics Має бути, перевірте man findв командному рядку, щоб побачити, які варіанти findпідтримують.
mu занадто короткий

8

Чому б не зробити рекурсивний пошук, щоб знайти всі екземпляри в підкаталогах:

grep -r 'text' *

Це працює як шарм.


1
Не потрібно цитувати рядок пошуку без спеціальних символів, як пробіли
Скотт Стенсленд

5
  1. grep -r "yourstring" * Ви знайдете "вашу нитку" у будь-яких файлах і папках

Тепер, якщо ви хочете шукати дві різні рядки одночасно, ви завжди можете скористатися опцією E та додати слова для пошуку. Приклад після перерви

  1. grep -rE "yourstring|yourotherstring|$" *буде шукати список місць, де yourstringабо yourotherstringзбігається

4

Ще один варіант, який я люблю використовувати:

find folder_name -type f -exec grep your_text  {} \;

-type f повертає вам лише файли, а не папки

-exec і {} запускає греп на файли, знайдені в пошуку (точний синтаксис - "команда -exec {}").


4
grep -R "string" /directory/

-R слід також позначає, коли -r не робить.


2

Відповідь, яку ви вибрали, добре, і вона працює, але це не правильний спосіб зробити це, оскільки:

grep -nr yourString* .

Це насправді шукає рядок "yourStrin"і "g"0 або багато разів.

Тож правильний спосіб це зробити:

grep -nr \w*yourString\w* .

Ця команда шукає рядок з будь-яким символом до і після в поточній папці.


2
однак grep -nr yourStringпрацює також, як це виглядає оголеним у yourStringбудь-якій точці лінії (або, принаймні, у моїй системі OSX Lion)
theheadofabroom

1

Подібно до відповіді, опублікованої @eLRuLL, більш простим способом вказати пошук, який дотримується меж слова, є використання -wпараметра:

grep -wnr "yourString" .

У cmd запиту або терміналу Windows термін grep не розпізнається
kouty

@kouty grep - це команда Unix. itechtics.com/using-findstr-windows
Hugo M. Zuleta

1

Виконайте (термінал) наступну команду всередині каталогу. Він буде рекурсивно перевіряти і всередині підкаталогів.

grep -r 'your string goes here' * 

0

Наступний зразок шукає рекурсивно your search stringв файлах *.xmlта *.jsфайлах, розташованих десь усередині папок path1, path2та path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

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


-4

Не використовуйте grep. Завантажте Silver Searcher або ripgrep . Вони обидва видатні, і набагато швидше, ніж греп або хід з великою кількістю варіантів.


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