Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: Ausschliessen bestimmter Endungen z.B. beim Löschen
Hallo
Gibt es einen einfachen Befehl, bez. ein Zeichen mit dem man Bestimmte Endungen bei einem Befehlsafruf ausschliessen kann?
rm *.JPG
löscht ja alle Dateien mit der Endung JPG. Nun möchte ich aber alles andere ausser JPG löschen. Gibt es dafür eine einfache Eingabe?
BTW: Kann man eine Eingabe machen bei der GROSS/kleinschreibung ignoriert wird? (Also sowohl *.JPG als auch *.jpg gelöscht werden?)
1. Ja, das geht:
,shopt|grep ext
extglob off
,shopt -s extglob
,shopt|grep ext
extglob on
,touch a.sh b.sh a.exe b.exe
,ls !(*.sh)
a.exe b.exe
,ls
a.exe a.sh b.exe b.sh
2. Das sollte mit regulaeren Ausdruecken laufen.
3. Naechstes Mal die Frage in mrunix.de stellen, das ist fuer
sowas gedacht.
Gruss 403
Hast Du es mal mit "find -delete...." versucht.
Vielleicht mit dem -(i)regex Switch:
-regex pattern
File name matches regular expression pattern. This is a match
on the whole path, not a search. For example, to match a file
named `./fubar3', you can use the regular expression `.*bar.' or
`.*b.*3', but not `f.*r3'. The regular expressions understood
by find are by default Emacs Regular Expressions, but this can
be changed with the -regextype option.
-iregex pattern
Like -regex, but the match is case insensitive.
ls | grep -v -i "jpg$" | xargs rm
ls | grep -v -i "jpg$" | xargs rm
Vielen Dank, genau das hab ich gesucht!
Nur der vollständigkeit halber, wozu ist das "$" hinter "jpg"? In meinem Versuch ging es auch ohne.
Das $ heisst, das das jpg am Ende stehen muss, findet also zB kein test-jpg.mpg
Aha, dann ergibt es Sinn.
Wo wir gerade dabei sind: kann man auch nach nach "jpg" und "jpeg" gleichzeitig filtern?
ls *.jp*g
Das ergibt die gewünschte Ausgabe, aber grep scheint das nicht zu interpretieren. Gibt es da andere Platzhalter als "*"?
grep -v -i 'jp.*g$'...was natürlich auch "datei-jp.mpeg" erfassen würde....
sicherer wäre ein pattern "jpe?g$" (ist das korrekt geschrieben oder muss das e noch gruppiert werden... - ggf. mal testen)
hm,
ls | egrep -iv "(\.jpe?g$)" klappt, findet dann allerdings auch jpg.jpg.jpg, jpg und jpg.jpg.mp3 Wie sagt man, matche den letzen Punkt von hinten? Mit
Backreferenzen?
grep -v -i 'jpg$' | grep -v -i 'jpeg$'
hm,
ls | egrep -iv "(\.jpe?g$)" klappt, findet dann allerdings auch jpg.jpg.jpg, jpg und jpg.jpg.mp3 Wie sagt man, matche den letzen Punkt von hinten? Mit
Backreferenzen?
egrep -i "(\.jpe?g$)" sollte nicht bla.jpg.mp3 matchen!!! Durch das $ muss .jpeg/.jpg am Ende stehen und "?" kann im Gegensatz zu "*" auch nicht greedy sein.
/Edit: wozu eigentlich die Klammern? warum nicht egrep -i "\.jpe?g$"
So langsam wird es für einen bash- Anfänger wie mich unübersichtlich. :confused:
Gibt es zu all den (".'\$/*?!) irgendwo eine übersichtliche Erklärung? (Vorzugsweise in Deutsch :))
Ansonsten: mit der Lösung von drcux kann ich mein Ziel durchaus erreichen. Vielen Dank!
Such einfach mal im Netz nach Anleitungen zu "Regular Expressions"...
Ein guter Ansatz ist z.B. die Perl-Abteilung auf SelfHTML - es gibt dann maximal noch ein paar Syntax-Differenzen aber für den Einstieg sollte es reichen...
Hi!
2. Das sollte mit regulaeren Ausdruecken laufen.
Das geht auch ohne:
shopt -s extglob nocaseglob
rm !(*.jpg)
Gruß
fuffy
Er fragte aber:
Gibt es zu all den (".'\$/*?!) irgendwo eine übersichtliche Erklärung? (Vorzugsweise in Deutsch :))
-> RegEx. Dass es auch ohne geht - wurde weiter oben von Dir ja schon erwähnt...
Das war mein erster Beitrag in diesem Thread. ;)
Ich bezog mich auf das Ursprungsposting und die erste Antwort. Die Variante mit "nocaseglob", bei der man auch für case-insensitive Suche auf reguläre Ausdrücke verzichten kann, wurde noch von keinem genannt.
Gruß
fuffy
öhm, ok. Sollte man wohl nochmals nachschauen, bevor man postet...
Ok, es war jemand anders, der das schon mal gepostet hat und er hat etwas anderes, das auf den ersten Blick beim durchlesen gleich aus sieht gepostet... :-)
egrep -i "(\.jpe?g$)" sollte nicht bla.jpg.mp3 matchen!!! Durch das $ muss .jpeg/.jpg am Ende stehen und "?" kann im Gegensatz zu "*" auch nicht greedy sein.
/Edit: wozu eigentlich die Klammern? warum nicht egrep -i "\.jpe?g$"
Ja, das war ein Tippfehler, es haette jpg.mp3.jpg heissen sollen. :rolleyes:
Aber es ging mir um mehrfache Punkte im Ausdruck. Die Klammern waren
noch Restmuell von einem Versuch einen Punkt mehrfach auftretend einem
einzelnen Punkt mit dem Ausdruck gegenueberzustellen und dann via
Backreferenz anzusprechen.
Gruss 403
EDIT: Laut chat lautet die Variante:
ls | egrep -vi '^[^.]*\.jpe?g$'
Ein sed zum Taggen von mehr als einem Punkt waere:
sed 's/\(.*\)\.jpeg\(.*jpeg\)/\1-tag-/'
Die Variante dann wieder Case Insensitiv/jpg freundlich zu machen, bleibt Aufgabe des geneigneten Lesers :D
Gruss 403
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.