grep "*.JPG" gibt keine Einträge mit der Endung .JPG zurück

grep "*.JPG" gibt keine Einträge mit der Endung .JPG zurück

Wenn ich diesen Befehl ausführe ls -l Documents/phone_photo_vids, erhalte ich Hunderte von Einträgen im folgenden Format. Beachten Sie, dass die Endungen der Bilder entweder PNG oder JPG sind

-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

Ich entschied dann, dass ich nur die JPG-Ergebnisse sehen wollte, also führte ich beide Befehle aus, die beide keine Ergebnisse zurückgaben

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

Ich hätte erwartet, dass beide Grep-Befehle alle Dateien mit der Endung PNG herausfiltern und alle Dateien mit der Endung JPG zurückgeben, aber ich habe nichts bekommen. Wie verwende ich Grep falsch?

Ich arbeite auf einem Mac OSX 10.9.3

Antwort1

Einige Formen von Antworten sindFALSCHobwohl es meistens so funktioniert wie es behauptet.

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)

Um das beste Ergebnis zu erzielen, versuchen Sie Folgendes:

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

Antwort2

Wie andere bereits gesagt haben, versuchen Sie, Shell-Platzhalter ( *) innerhalb von grep zu verwenden, wobei der Platzhalter für ein einzelnes Zeichen der Punkt ( .) ist. Muster von .JPGwürden übereinstimmen xxx.NOTAJPGoder NOTAJPG.txtwenn es so etwas gäbe.

Die bessere Lösung ist, einfach zu sagen:

ls -l Documents/phone_photo_vids/*.jpg

Wenn Sie die Groß- und Kleinschreibung ignorieren möchten

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

Das ist dasselbe wie zu sagen:*.jpg *.JPG

Es wird nicht empfohlen, aber wenn SieWirklichWenn Sie möchten, dass es mit funktioniert grep, geben Sie einfach Dateien mit der Endung an jpgund machen Sie es vielleicht mit unabhängig von Groß- und Kleinschreibung -i. Sie brauchen das ganze Zeug nicht '.*.'.

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

Antwort3

Grep verwendet sogenannte reguläre Ausdrücke und nicht das, was DOS oder Windows für Suchvorgänge verwenden.

Der Regex-Ausdruck „*.JPG$“ ergibt für grep keinen Sinn, daher wird er wahrscheinlich ignoriert. Was Sie wollen, ist „.*JPG$“

FürReferenz.

Antwort4

Versuche Folgendes:

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

Sie können mit temporäre Dateien erstellen touch "img.jpg.txt" ".jpg"und diese verwenden, grep --color=alwaysum zu sehen, wie die obigen Muster die Ausgabe ändern.

Übrigens lsist Parsen normalerweise keine gute Idee, verwenden Sie besser find:

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

verwandte Informationen