![grep "*.JPG" não retorna entradas que terminam em .JPG](https://rvso.com/image/1421874/grep%20%22*.JPG%22%20n%C3%A3o%20retorna%20entradas%20que%20terminam%20em%20.JPG.png)
Quando executo este comando ls -l Documents/phone_photo_vids
, recebo centenas 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 esses dois comandos, e ambos não retornaram resultados
ls -l Documents/phone_photo_vids | grep "*.JPG"
ls -l Documents/phone_photo_vids | grep "*.JPG$"
Eu esperava que ambos os comandos grep filtrassem todos os arquivos que terminam em PNG e retornassem todos os arquivos que terminam em JPG, mas não obtive nada. Como estou usando o grep incorretamente?
Estou trabalhando em um Mac OSX 10.9.3
Responder1
Algumas formas de respostas sãoERRADOembora funcione como afirma na maioria das vezes.
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)
Então, para obter o melhor resultado, experimente estes:
grep "[.]jpg$" #anything that end with ".jpg"
grep "\\.jpg$" #the same as above, use escape sequence instead
Responder2
Como já foi dito, você está tentando usar curingas de shell ( *
) no grep, onde o curinga para um único caractere é o ponto ( .
). Os padrões .JPG
combinariam xxx.NOTAJPG
ou NOTAJPG.txt
se existisse 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êrealmentedeseja fazê-lo funcionar grep
, basta especificar os arquivos que terminam com jpg
e talvez torná-los insensíveis a maiúsculas e minúsculas com -i
. Você não precisa de todas as '.*.'
coisas.
ls -l Documents/phone_photo_vids | grep -i jpg$
Responder3
Grep usa o que é chamado de regex, não o que o DOS ou o Windows usam para pesquisas.
A expressão regex "*.JPG$" não faz sentido para o grep, então provavelmente a ignora. O que você quer é ".*JPG$"
Parareferência.
Responder4
Experimente 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 touch "img.jpg.txt" ".jpg"
e usá-los grep --color=always
para ver como os padrões acima alteram a saída.
Aliás, a análise ls
geralmente não é uma boa ideia, é melhor usar find
:
find /path/to/files/ -maxdepth 1 -type f -iname '*.jpg'