![grep "*.JPG" не возвращает записи, заканчивающиеся на .JPG](https://rvso.com/image/1421874/grep%20%22*.JPG%22%20%D0%BD%D0%B5%20%D0%B2%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%89%D0%B0%D0%B5%D1%82%20%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8%2C%20%D0%B7%D0%B0%D0%BA%D0%B0%D0%BD%D1%87%D0%B8%D0%B2%D0%B0%D1%8E%D1%89%D0%B8%D0%B5%D1%81%D1%8F%20%D0%BD%D0%B0%20.JPG.png)
Когда я запускаю эту команду 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'