Dateien löschen mit negierun

E

eclipse240hp

Grünschnabel
Hallo, ich habe hier einen Ordner mit vielen Grafiken und möchte gerne bestimmte davon löschen.

Die Grafiken heißen z.B. so

bild1.jpg bild1_d.jpg bild1_280.jpg bild1_d.png

und ich mochte nun alle bilder löschen, die wie "bil1.jpg" heißen, also nicht '*_d.jpg' oder nicht '*_280.jpg' heißen.

Wie muss ich hier vorgehen um nur diese bilder zu löschen die in das Suchmuster passen?

das ist mein bisheriges Script
PHP:
for i in *; do if $i ! -name *_d.jpg ! -name *_280.jpg; then rm -f $i ; echo $i;  done

leider bekomme ich hier aber den Felfer -bash: syntax error near unexpected token `done'

kann mir jemand helfen?
 
Zuletzt bearbeitet:
leider bekomme ich hier aber den Felfer -bash: syntax error near unexpected token `done'
Du hast das "fi" vergessen. Allerdings vermute ich dass du dann weitere Fehler bekommen wirst, weil die if Syntax nicht stimmt, jedenfalls kann ich mir nicht vorstellen dass er das so schluckt.
 
jo hast recht, das führt immer noch zu fehlern, dies mal andere unexpected fehler.
Weißt du auf die schnelle wie der code richtig ist? Ich bin total der anfänger in shell und brauche nur diese zeile um ein paar 100.000 dateien zu löschen :)
 
Hmm, wenn du eine halbwegs aktuelle Bash Version benutzt, sollte was in diese Richtung funktionieren:
Code:
for i in *.jpg; do
  if [[ ! $i =~ _280 && ! $i =~ _d ]]; then 
    echo rm $i
  fi
done
 
Ich habe das nun so abgeändert, aber leider werden alle dateien gelöscht
PHP:
for i in *; do 
   if [[ ! $i =~ *_270.png && ! $i =~ *_d.png ]]; then  
   rm -f $i;   
   echo rm $i;   
fi; done
 
Ich habe das nun so abgeändert, aber leider werden alle dateien gelöscht
Logisch, weil du "*" eingefuegt hast. Der matching operator =~ liefert Wahr zurueck, wenn ein Muster in einem String zu finden ist. Wenn du "*" in deinem matching string hast, wird alles gematcht.

Nebenbei lasse ich mir beim testen immer erstmal den Befehl den ich ausfuehren lassen will mit echo ausgeben, um sicher zu sein dass alles richtig ist bevor der Befehl tatsaechlich ausgefuehrt wird.

Edit:
Eh, na gut, meine erste Erklaerung war falsch. ;)
Genau das Gegenteil ist der Fall, weil du keine Dateien hast die ein "*" im Namen haben, werden alle Dateien gematcht. Hatte mir den Code vorm schreiben nicht nochmal angeguckt. ;)
 
Zuletzt bearbeitet:
achso ok. Ich habe hier aber leider nicht nur .jpg sondern auch .png .. daher setze ich * ein. ich dachte es wird nun im if geprüft ob es passt oder nicht. wie muss ich das denn machen, damit das mit * geht?

Danke schonmal für deine hilfe! :)
 
Eh, ich bezog mich auf die if-Abfrage, nicht die Schleife. Selbstverstaendlich kannst du alle Dateien mit in die Schleife einbeziehen, aber du musst schon die richtige if-Abfrage schreiben.
 
ich habe es hinbekommen
PHP:
for i in *; do 
   if [[  $i != *_270.png &&  $i != *_d.png ]]; then  
   rm -f $i;   
   echo rm $i;   
fi; done
 
Die Bilder heißen also alle bild* und die die gelöscht werden sollen, haben keinen Underscore im Namen.
Das schreit nach einer RegExp:
Code:
find ./ -regex '.*bild[^_]*\....' -exec rm {} \;
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Shell Skript beschleunigen

HandbrakeCLI Shell Skript

Datei auslesen und fund per MAil versenden.

Sed: Bestimmtes Feld einer "Zeile mit mehreren Feldern" ergänzen

Zurück
Oben