Почему GREP выводит двоичные файлы, а не один файл с именем «0.jpg»?

Я люблю BASH, но борюсь с GREP.

Моя цель проста: GREP файлы моего рабочего стола для «0.jpg».

МОЙ БЭШ КОД:

$ pwd /Users/jennalusche/Desktop $ grep "0" *.jpg 

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

 0.jpg 

ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ:

 Binary file IMG_2125.jpg matches Binary file the-letter-just-j-bw-vectorized-v2.jpg matches 

ОПЕРАЦИОННАЯ СИСТЕМА

Mac OS X Йосемити

МОЙ ВОПРОС

Почему GREP «0» * .jpg показывает двоичные файлы, а не один файл с именем «0.jpg»?

МОЕ ОБОСНОВАНИЕ ОТЛАДКИ

Я предполагаю, что причина, по которой эти файлы отображаются, заключается в том, что они оба являются «двоичными». «Двоичный файл» = файл закодирован в 0 и 1. Таким образом, оба отображаемых файла должны переводиться как 0, в то время как все остальные файлы в моем PWD переводятся как 1.

МОЙ ОБЩИЙ ВОПРОС –

Почему не 0.jpg вывод?

ОБОСНОВАНИЕ ПРОВЕРИТЬ

Я предполагаю, что оба выходных файла, в двоичных терминах, равны 0, а все остальные файлы в PWD равны 1. Это предположение верно?

ПОЙДИТЕ В КРЫШКУ КРОЛИКА –

Почему в результате файлы 0? Я специально не кодировал эти файлы специально. Файлы, которые не отображаются в моем поиске GREP, закодированы как 1? Если так, то почему?

ПЕРЕКЛЮЧЕНИЕ ОТДЫХА КРОЛИКОВ ГЛУБИНЫ – GREP. SED. AWK. Левая сторона КОШКА. ECHO. НАХОДИТЬ.

Очевидно, что в каждой из этих утилит много общего.

Какая ваша любимая комбинация с точки зрения использования?

Утилита grep ищет в файлах строки, соответствующие регулярным выражениям.

То, что вы (кажется) хотите сделать, это перечислить все файлы в текущем каталоге, которые содержат 0 (ноль) в своих именах файлов и имеют суффикс имени файла .jpg . Для этого вы бы использовали что-то вроде

 ls -l ./*0*.jpg 

или действительно просто

 echo ./*0*.jpg 

Первая часть шаблона, *0* , будет соответствовать любой строке, содержащей ноль, в то время как последняя часть шаблона, .jpg , будет ограничивать результирующие имена файлов теми, которые заканчиваются этим суффиксом. ./ означает «в этом каталоге» и действительно нужен, только если у вас есть имена файлов, начинающиеся с - (тире) (в противном случае они могли бы быть неверно истолкованы как параметры командной строки) ¹.

Расширение этого шаблона выполняется оболочкой перед вызовом ls , поэтому ls получит расширенный список имен файлов, которые соответствуют шаблону, и выведет их.

Обратите внимание, что шаблоны подстановки имен файлов не являются регулярными выражениями (только похожи на них). grep , с другой стороны, берет одно или несколько регулярных выражений и ищет их в содержимом файлов.


Отвечая на вопрос в комментариях : «Предупреждение» – это форма нефатального диагностического результата. Другой тип – это «ошибка», которая обычно является фатальной (т. Е. Программа не может продолжить работу в обычном режиме и завершает работу после вывода сообщения об ошибке).

Диагностические сообщения обычно не считаются частью стандартного вывода, который команда генерирует во время нормальной работы, и обычно создаются в специальном «выходном streamе» (в так называемом «стандартном streamе ошибок» в отличие от «стандартного выходного streamа») чтобы его можно было проверять отдельно или отбрасывать, и чтобы он не мешал обычному выводу команды.

В этом случае, однако, grep не может фактически отобразить данные, которые соответствуют шаблону, поскольку файл является двоичным, и данные, скорее всего, не могут быть напечатаны, поэтому вместо этого он уведомляет вас о том, что в Binary file IMG_2125.jpg matches через сообщение Binary file IMG_2125.jpg matches Вместо этого Binary file IMG_2125.jpg matches (на самом деле это не диагностическое предупреждающее сообщение, как предлагает mikeserv ).


¹ Обратите внимание, что если некоторые имена файлов содержат символы обратной косой черты, некоторые реализации echo будут интерпретировать \n , \b … как escape-последовательности для расширения.