Як я можу, щоб grep не роздрукував помилки "Немає такого файлу чи каталогу"?


215

Я переглядаю велику купу коду, якою керує git, і кожного разу, коли я роблю греп, я бачу палі і купи повідомлень форми:

> grep pattern * -R -n
whatever/.git/svn: No such file or directory

Чи є якийсь спосіб я змусити ці лінії відійти?


1
Сьогодні я рекомендую використовувати ag, ackабо cgrepзамість цього - вони набагато швидше / краще, ніж grepдля пошуку сховищ коду.
lunixbochs

Якщо ви проглядаєте код і хочете уникати конкретних каталогів, можливо, вам варто поглянути на ack. Це греп, що знає вихідний код, і як такий буде активно ігнорувати такі каталоги VCS (а також резервні копії vi та emacs, не вихідні файли тощо).
Брайан Агнеу

2
Як користувач може отримувати No such file or directoryповідомлення про наявні файли та / або каталоги? Або, навпаки, як можна grep *отримати імена файлів, які не існують? Це умова гонки, коли якийсь інший процес маніпулює деревом каталогів (створення, перейменування та видалення файлів) під час grepзапуску?
Скотт

Відповіді:


299

Ви можете використовувати -sабо --no-messagesпрапор, щоб придушити помилки.

-s, --no-messages придушують повідомлення про помилки

grep pattern * -s -R -n

14
@Alex @Dogbert Це відповідає на питання, але "-s" може приховати проблеми, наприклад, коли ви використовуєте xargs з grep. Спробуйте створити 2 файли в dir, 'aaa.txt' і 'b.txt', обидва містять рядок 'деякий текст'. Команда /bin/ls -1 | xargs grep 'some text'дасть вам "немає такого файлу чи каталогу", оскільки воно розбиває "b.txt" на 2 аргументи. Якщо ви придушите, ви не помітите, що ви пропустили файл.
Келвін

@Kelvin робить, наприклад , якщо я використовую findі використовувати print0з xargs -0Does , що вирішити цю проблему? Спасибі
Лука

1
@Luka Це повинно вирішити проблему. Ви не зіткнетесь з проблемами, якщо завжди будете використовувати ці параметри NUL, але якщо цього не зробите, майже гарантовано (IMHO) ви забудете у самий невідповідний час.
Кельвін

це працює на Mac OS X, де інші параметри (
тихо

59

Якщо ви перебираєтесь через сховище git, я рекомендую вам скористатися git grep. Вам не потрібно проходити -Rабо шлях.

git grep pattern

Це покаже всі збіги з поточного каталогу вниз.


5
+1 за корисну команду git. Не працюватимуть для svn, хоча :-)
cadrian

2
+1 Ця команда git, яку я пропустив - дозволяє мені отримати греп за рядком зі стану дерева в будь-якому фіксації (додавши команду після "шаблону").
Келвін

1
За допомогою втікача плагін Ggrepтакож здійснює пошук, починаючи з верхньої частини каталогу Git замість поточного каталогу.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Це здається значно швидшим, ніж стандартний греп. (Можливо, він ігнорує двійкові файли тощо? Немає ідеї, але корисно.)
Даніель,

10

Такі помилки зазвичай надсилаються в потік "стандартної помилки", який ви можете передавати у файл або просто змусити зникнути в більшості команд:

grep pattern * -R -n 2>/dev/null

Відповідає на питання, але може замаскувати проблеми. Дивіться мій коментар під відповіддю Догберта.
Келвін

5

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

Я, як правило, не турбуюсь, виконуючи завдання sysadmin над консоллю, але зсередини скриптів я шукаю текстові файли з "find", а потім обчислюю кожен:

find /etc -type f -exec grep -nHi -e "widehat" {} \;

Замість:

grep -nRHi -e "widehat" /etc

4

Зазвичай я не дозволяю грепу робити саму рекурсію. Зазвичай є кілька каталогів, які ви хочете пропустити (.git, .svn ...)

Ви можете робити розумні псевдоніми з такою позицією:

find . \( -name .svn -o -name .git \) -prune -o -type f -exec grep -Hn pattern {} \;

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


1
+1. Це набагато краще, ніж придушення помилок. Однак я думаю, що ти забув -execраніше, ніж твій греп.
Келвін

1
Що це означає? \( -name .svn -o -name .git \)
sbhatla

Чому б не використовувати прапор grep's --exclude або --exlcude-dir?
Choylton B. Higginbottom,

1
@sbhatla в дужках створюють порядок операцій для команди find. stackoverflow.com/questions/24338777 / ...
Choylton B. Higginbottom

4

Ви спробували -0варіант у xargs ? Щось на зразок цього:

ls -r1 | xargs -0 grep 'some text'

2
для знаходження слід додати find -print0 | xargs -0 grep 'text'
-print0

1

Використовувати -Iв греп.

Приклад: grep SEARCH_ME -Irs ~/logs.


1
-Iпропускає бінарні файли - це рівнозначно --binary-files=without-match. Однак він не пригнічує повідомлення "Немає такого файлу чи каталогу".
mwfearnley

0

Я переадресовую stderrна, stdoutа потім використовую програму grep's invert-match ( -v), щоб виключити рядок попередження / помилки, яку я хочу приховати:

grep -r <pattern> * 2>&1 | grep -v "No such file or directory"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.