Por que o GREP está exibindo ARQUIVOS BINÁRIOS em vez de um ÚNICO ARQUIVO chamado “0.jpg”?

0

Eu amo BASH, mas estou lutando com o GREP.

Meu objetivo é simples: arquivos do GREP my Desktop para "0.jpg".

MY BASH CODE:

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

RESULTADO ESPERADO:

0.jpg

RESULTADO REAL:

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

SISTEMA OPERACIONAL

Mac OS X Yosemite

MINHA PERGUNTA

Por que o GREP “0” * .jpg está exibindo arquivos binários em vez de um arquivo único chamado “0.jpg”?

MINHA FUNDAMENTAÇÃO DE DEBUGAGEM

Estou assumindo que a razão pela qual esses arquivos estão sendo exibidos se deve ao fato de serem "binários". "Arquivo binário" = o arquivo é codificado em 0 & 1s Assim, os dois arquivos exibidos devem ser traduzidos como 0, enquanto todos os outros arquivos do meu PWD são traduzidos como 1s.

MINHA PERGUNTA ÓBVIA -

Por que a saída não é 0.jpg?

VERIFICAÇÃO DA FUNDAMENTAÇÃO

Suponho que os dois arquivos de saída, em termos binários, são 0 e todos os outros arquivos no PWD são 1. Esta suposição está correta?

INDO O FURO DO COELHO -

Por que os arquivos resultantes são 0? Eu não codifiquei esses arquivos de maneira especial de propósito. Os arquivos que não apareceram na minha pesquisa do GREP foram codificados como 1? Se sim, por quê?

PARA BAIXAR BURACO DE COELHO MAIS PROFUNDO - GREP. SED. AWK LS GATO. ECO. ENCONTRAR

Obviamente, há muita sobreposição na funcionalidade de cada um desses utilitários.

Qual é sua combinação favorita em termos de uso?

    
por jlusche 01.09.2018 / 08:20

1 resposta

2

O utilitário grep procura dentro de arquivos por linhas que correspondem a expressões regulares.

O que você (parece) deseja fazer é listar todos os arquivos no diretório atual que contenham 0 (zero) em seus nomes de arquivos e que tenha um sufixo de nome de arquivo de .jpg . Para fazer isso, você usaria algo como

ls -l ./*0*.jpg

ou simplesmente

echo ./*0*.jpg

A primeira parte do padrão, *0* , corresponderá a qualquer sequência que contenha um zero, enquanto a última parte do padrão, .jpg , limitará os nomes de arquivos resultantes àqueles que terminarem com esse sufixo. O ./ significa "neste diretório" e só é realmente necessário se você tiver nomes de arquivos que começam com - (traço) (estes poderiam ser mal interpretados como opções de linha de comando) ¹.

A expansão desse padrão é feita pelo shell antes de chamar ls , portanto ls obteria a lista expandida de nomes de arquivos que correspondem ao padrão e os listaria.

Observe que os padrões de globalização de nomes de arquivos não são expressões regulares (apenas semelhantes a eles). grep , por outro lado, pega uma ou várias expressões regulares e procura por elas no conteúdo dos arquivos.

Respondendo a uma pergunta encontrada nos comentários : Um" aviso "é uma forma de saída de diagnóstico não fatal . O outro tipo é um "erro", que geralmente é fatal (ou seja, o programa não pode continuar como de costume e termina após a saída da mensagem de erro).

As mensagens de diagnóstico geralmente não são consideradas parte da saída padrão que um comando produz durante a operação normal e geralmente são produzidas em um "fluxo de saída" especial (no chamado "fluxo de erro padrão" em oposição a "saída padrão"). stream ") para que possa ser inspecionado separadamente, ou descartado, e para que não interfira com a saída ordinária do comando.

Neste caso, porém, grep é incapaz de mostrar os dados que correspondem ao padrão, já que o arquivo é binário e os dados provavelmente não são imprimíveis, então ele notifica que havia uma correspondência no arquivo pela mensagem Binary file IMG_2125.jpg matches (isso não é realmente uma mensagem de aviso de diagnóstico como mikeserv sugere ).

¹ Observe que, se alguns nomes de arquivos contiverem caracteres de barra invertida, algumas echo implementações interpretariam as \n , \b ... como seqüências de escape a serem expandidas.

    
por 01.09.2018 / 09:10

Tags