Як шукати слово у всьому вмісті каталогу в Linux


15

потрібно щось шукати у всьому вмісті

Я намагаюся:

find . | xargs grep word

Я отримую помилку:

xargs: незакінчена цитата

Як цього досягти?

Відповіді:


15

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

Якщо ваш греп підтримує -rабо -Rваріант для рекурсивного пошуку, використовуйте його.

grep -r word .

В іншому випадку використовуйте -execосновний find. Це звичайний спосіб досягти такого ж ефекту, як xargs, за винятком обмежень у назвах файлів. Розуміно, що останні версії findдозволяють згрупувати кілька файлів в один виклик до допоміжної команди. Переходите /dev/nullдо того, grepщо він відображатиме ім’я файлу перед кожним збігом, навіть якщо він трапляється викликати один файл.

find . -type f -exec grep word /dev/null {} +

Старіші версії find(на старих системах або OpenBSD, або зменшених утилітах, таких як BusyBox) можуть викликати допоміжну команду лише в одному файлі за один раз.

find . -type f -exec grep word /dev/null {} \;

Деякі версії findта xargsмають розширення, які дозволяють їм правильно спілкуватися, використовуючи нульові символи для розділення імен файлів, так що не потрібно цитувати. У наші дні лише OpenBSD має цю функцію, не маючи -exec … {} +.

find . -type f -print0 | xargs -0 grep word /dev/null

+1 спеціально для /dev/null. Неприємно, коли формат виводу може змінюватись, залежно від того, скільки файлів зібрано ... спасибі.
Пітер.О

12

Я думаю, ви маєте на увазі перший варіант

рекурсивний греп для пошуку вмісту у файлах

grep -R "content_to_search" /path/to/directory

Рекурсивна для пошуку файлів, які відповідають

ls -lR | grep "your_search"

grep -rin for recursive-case_insensitive-show_line_number

Я хочу мати можливість пошуку за вмістом кожного файлу.

перший повертає будь-яку інцидент у будь-якому файлі, вказуючи файл, де ця знайдена

2

Якщо у вас є інструменти GNU (що ви робите, якщо тег Linux точний), ви можете використовувати -print0та -0обійти звичайні проблеми котирування:

find . -type f -print0 | xargs -0 grep word

0

Там також вивів , він призначений , щоб пропустити спеціальні каталоги , як .svn, .gitі тому подібне. Це щоденний інструмент для розробників.

Це досить близько до для загальних комутаторів.

Вих. :

ack -r string .

Пакет ack-grepпро debian і debian.



-1

Я думаю, ви хочете знайти рядок у файлах

Спробуйте find . -name "*" | xargs grep -l "string"


Повідомлення про помилку з xargs ("Невизначена цитата") означає, що в ОП є файл. яка має в своїй назві цитату. Ваша лінія також буде процвітати на цьому. Як зауважив Му, вам потрібно інше припинення.
титон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.