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 中使用 shell 通配符 ( ),其中单个字符的通配符是点 ( .)。 的模式.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 用于搜索的表达式。

正则表达式“*.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'

相关内容