2

Когда я запускаю эту команду 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

4 ответа4

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$
1

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

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

Для справки.

1

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

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'
0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .