![grep "*.JPG" gibt keine Einträge mit der Endung .JPG zurück](https://rvso.com/image/1421874/grep%20%22*.JPG%22%20gibt%20keine%20Eintr%C3%A4ge%20mit%20der%20Endung%20.JPG%20zur%C3%BCck.png)
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 .JPG
würden übereinstimmen xxx.NOTAJPG
oder NOTAJPG.txt
wenn 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 jpg
und 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=always
um zu sehen, wie die obigen Muster die Ausgabe ändern.
Übrigens ls
ist Parsen normalerweise keine gute Idee, verwenden Sie besser find
:
find /path/to/files/ -maxdepth 1 -type f -iname '*.jpg'