PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash: Ausschliessen bestimmter Endungen z.B. beim Löschen



Wene
20.08.07, 22:29
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?)

403
21.08.07, 05:10
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

tschloss
21.08.07, 07:15
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.

drcux
21.08.07, 07:17
ls | grep -v -i "jpg$" | xargs rm

Wene
21.08.07, 07:35
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.

drcux
21.08.07, 07:54
Das $ heisst, das das jpg am Ende stehen muss, findet also zB kein test-jpg.mpg

Wene
21.08.07, 08:04
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 "*"?

drcux
21.08.07, 08:22
grep -v -i 'jp.*g$'

tschloss
21.08.07, 08:33
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)

403
21.08.07, 09:11
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?

drcux
21.08.07, 09:31
grep -v -i 'jpg$' | grep -v -i 'jpeg$'

tschloss
21.08.07, 09:47
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$"

Wene
21.08.07, 10:46
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!

marce
21.08.07, 10:48
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...

fuffy
21.08.07, 12:30
Hi!


2. Das sollte mit regulaeren Ausdruecken laufen.
Das geht auch ohne:

shopt -s extglob nocaseglob
rm !(*.jpg)

Gruß
fuffy

marce
21.08.07, 12:32
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...

fuffy
21.08.07, 12:37
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

marce
21.08.07, 12:39
ö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... :-)

403
21.08.07, 21:06
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