Чому за замовчуванням не grep ігнорує бінарні файли?


94

Роздільна сторінка для grepописує -Iпрапор наступним чином:

-I      Ignore binary files.  This option is equivalent to 
        --binary-file=without-match option.

Це також говорить про двійкові файли:

 --binary-files=value Controls searching and printing of binary files.
         Options are binary, the default: search binary files but do not print
         them; without-match: do not search binary files; and text: treat all
         files as text.

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


4
Ви можете встановити змінну GREP_OPTIONSдо бажаних налаштувань, тоді вам не доведеться використовувати стільки комутаторів командного рядка.
Марко

2
Примітка для інших команд, які не підтримують таку змінну: Ви можете встановити параметри за замовчуванням, визначивши псевдонім у своєму .(ba|z|foo)shrc': псевдонімі grep = "grep -I" `.
Ерік

1
Це насправді може бути дуже корисним. Наприклад, я шукав версію єдності проекту, і не міг пригадати, в якому файлі він зберігався. Я шукав формат версії, і з’явився декілька бінарних файлів, які відповідають. Виявилося, як це було до попередньої версії 5, версія була присутня лише у двійковому файлі, тому без бінарного збігу я, можливо, її пропустив.
Svend Hansen

FYI Там є інструмент вивів який є свого роду «краще , ніж Grep». Ack не шукає двійкові файли. У Debian він надходить під назвою "ack-grep".
teika kazura

Відповіді:


91

Не все, що греп вважає двійковим файлом, насправді є двійковим файлом. наприклад, журнали ляльок мають в них кольорове кодування ансі, що змушує греп вважати, що вони двійкові. Я все одно хотів би їх пошукати, якщо я проглядаю / var / log, хоча.


4
Те саме стосується і файлів PDF.
Джозеф Р.

12
+ історично grep НЕ міг цього робити, тому для сумісності лише типовий стандарт повинен бути всеосяжним.
Олів'є Дулак

2
@OlivierDulac це має сенс, інакше за замовчуванням має бути ігнорування двійкових файлів.
Даган

5

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

grep function_name / lib / lib *

знайти бібліотеку, яка містить його. (Бібліотеки - це двійкові файли.)


У цьому випадку, ви б краще використовувати grep -l function_name /lib/lib*або nm -Do /lib/lib* | grep function_nameчи ldconfig -p | grep -o '/.*/lib.*' | xargs nm -Do | grep function_nameхоча.
Стефан Шазелас

Ну, grep some_function /lib/*коротше і зазвичай дає правильну відповідь - назва бібліотеки, яку я шукаю. Але так, іноді потрібен і більш досконалий підхід, як ваш.
Даніель Фружинський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.