grep “* .JPG” não retornando entradas terminadas em .JPG

2

Quando executo este comando ls -l Documents/phone_photo_vids , recebo 100 s de entradas no seguinte formato. Observe que os finais das imagens são PNG ou JPG

-rw-r--r--  1 moi  staff      189280 Oct 29  2011 IMG_0041.PNG
-rw-r--r--  1 moi staff     2481306 Oct 29  2011 IMG_0042.JPG

Decidi então que queria apenas ver os resultados do jpg, então executei ambos os comandos, os quais não retornaram resultados

 ls -l Documents/phone_photo_vids | grep "*.JPG"
 ls -l Documents/phone_photo_vids | grep "*.JPG$"

Eu esperava que os dois comandos do grep filtrassem todos os arquivos terminados em PNG e retornassem todos os arquivos terminados em JPG, mas não obtive nada. Como estou usando o grep incorretamente?

Estou trabalhando em um Mac OSX 10.9.3

    
por BrainLikeADullPencil 05.09.2014 / 03:56

4 respostas

0

Algumas formas de respostas são WRONG , embora funcionem como afirmam na maior parte do tempo.

grep ".jpg"    #match string "jpg" anywhere in the filename with any character in front of it.
               # jpg -- not match
               # .jpg -- match
               # mjpgsfdfd -- match
grep ".*.jpg"  #basically the same thing as above
grep ".jpg$"   #match anything that have at least 4 chars and end with "jpg"
               # i_am_not_a_.dummy_jpg -- match
grep ".*.jpg$" #the same as above (basically)

Para ter o melhor resultado, tente estes:

grep "[.]jpg$" #anything that end with ".jpg"
grep "\.jpg$" #the same as above, use escape sequence instead
    
por 05.09.2014 / 05:47
2

Como outros já disseram, você está tentando usar curingas do shell ( * ) no grep, onde o curinga para um único caractere é o ponto ( . ). Padrões de .JPG corresponderiam a xxx.NOTAJPG ou NOTAJPG.txt se houvesse tal coisa.

A melhor solução é apenas dizer:

ls -l Documents/phone_photo_vids/*.jpg

Se você quiser insensibilidade a maiúsculas e minúsculas

ls Documents/phone_photo_vids/*.{jpg,JPG}

que é o mesmo que dizer ls *.jpg *.JPG

Não é recomendado, mas se você realmente deseja que ele funcione com grep , apenas especifique os arquivos que terminem em jpg e talvez não faça distinção entre -i . Você não precisa de todo o material '.*.' .

ls -l Documents/phone_photo_vids | grep -i jpg$
    
por 05.09.2014 / 05:02
1

O grep usa o que é chamado regex, não o que o DOS ou o Windows usa para pesquisas.

A expressão regex "* .JPG $" não faz sentido para o grep, por isso provavelmente a ignora. O que você quer é ". * JPG $"

Para referência .

    
por 05.09.2014 / 04:08
1

Tente o seguinte:

grep "jpg"    #match string "jpg" anywhere in the filename, so file "img.jpg.txt" match too
grep ".*jpg"  #match the whole line with string "jpg", here ".*" stands for any char zero or more times
grep "jpg$"   #match string "jpg" only at the end of line ("img.jpg.txt" will not match)
grep ".*jpg$" #match the whole line only if "jpg" is at the end of line
grep "\.jpg"  #match string ".jpg" - to search literaly for dot one need to escape it with backslash

Você pode criar arquivos temporários com touch "img.jpg.txt" ".jpg" e usar grep --color=always para ver como os padrões acima alteram a saída.

BTW, analisar ls geralmente não é uma boa ideia, use melhor find :

find /path/to/files/ -maxdepth 1 -type f -iname '*.jpg'
    
por 05.09.2014 / 04:21

Tags