grep "*.JPG" не возвращает записи, заканчивающиеся на .JPG

grep "*.JPG" не возвращает записи, заканчивающиеся на .JPG

Когда я запускаю эту команду ls -l Documents/phone_photo_vids, я получаю 100 записей в следующем формате. Обратите внимание, что окончания изображений либо PNG, либо 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

Затем я решил, что хочу увидеть только результаты в формате jpg, поэтому я запустил обе эти команды, обе из которых не вернули никаких результатов.

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

Я ожидал, что обе команды grep отфильтруют все файлы, заканчивающиеся на PNG, и вернут все файлы, заканчивающиеся на JPG, но ничего не получил. Как я неправильно использую grep?

Я работаю на Mac OSX 10.9.3

решение1

Некоторые формы ответов:НЕПРАВИЛЬНЫЙхотя в большинстве случаев он работает так, как и заявлено.

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)

Итак, чтобы получить наилучший результат, попробуйте следующее:

grep "[.]jpg$" #anything that end with ".jpg"
grep "\\.jpg$" #the same as above, use escape sequence instead

решение2

Как уже говорили другие, вы пытаетесь использовать подстановочные знаки оболочки ( *) в grep, где подстановочным знаком для одного символа является точка ( .). Шаблоны .JPGсовпали бы xxx.NOTAJPGили NOTAJPG.txtесли бы такие были.

Лучшее решение — просто сказать:

ls -l Documents/phone_photo_vids/*.jpg

Если вам нужна независимость от регистра

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

что то же самое, что сказать ls*.jpg *.JPG

Это не рекомендуется, но если выДействительнохотите, чтобы это работало с grep, просто укажите файлы, заканчивающиеся на jpgи, возможно, сделайте его нечувствительным к регистру с помощью -i. Вам не нужны все эти '.*.'вещи.

ls -l Documents/phone_photo_vids | grep -i jpg$

решение3

Grep использует так называемое регулярное выражение, а не то, что DOS или Windows используют для поиска.

Выражение regex "*.JPG$" не имеет смысла для grep, поэтому он, вероятно, игнорирует его. То, что вам нужно, это ".*JPG$"

Дляссылка.

решение4

Попробуйте следующее:

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

Вы можете создавать временные файлы touch "img.jpg.txt" ".jpg"и использовать их, grep --color=alwaysчтобы увидеть, как приведенные выше шаблоны изменяют вывод.

Кстати, парсинг lsобычно не очень хорошая идея, лучше использовать find:

find /path/to/files/ -maxdepth 1 -type f -iname '*.jpg'

Связанный контент