Alle Dateien löschen mit bestimmten Namen in Linux?


25.08.2021, 07:21

Wie ich dateien aufspüren kann weiß ich, ich möchte gerne wissen wie man diese bestimmten dateien löschen kann

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
find . -name '*test*' ! -name 'test123' -delete

Hier die einfachste Lösung, welche ich selbst auch immer verwende. Da kannst du natürlich auch noch mehr Ausnahmen hinzufügen.

Bevor du den Befehl mit -delete ausführst, würde ich ihn erst ohne ausführen, damit du auch sichergehen kannst, dass nur die Dateien gelöscht werden, die du auch löschen willst.

Woher ich das weiß:eigene Erfahrung – Nutze Linux täglich, sowohl auf Server als auch Desktop

Du kannst mittels "find" oder "locate" die Dateien finden, die du löschen willst, ggf. mittels "grep" die Trefferliste ein wenig filtern. Dann ein kleines Skript schreiben, im Schlage von

#!/bin/bash
for FILE in $(find [...]); do
  rm $FILE;
done
Woher ich das weiß:Hobby – Linux-Nutzer seit 2006

grtgrt  25.08.2021, 13:02

Elegant, aber wenig robust: Wehe man macht im Teil [...] irgend einen Flüchtigkeitsfehler.

0
PhotonX  25.08.2021, 13:04
@grtgrt

Die Vorschläge, die mit Pipes und Ähnlichem arbeiten und ohne eine For-Schleife auskommen, finde ich ehrlich gesagt eleganter, also zumindest ein gutes Stück kompakter. :)

0
grtgrt  25.08.2021, 13:08
@PhotonX

Wahr mag auch sein: Über Robustheit wird man eher Einigkeit erzielen als über Eleganz (wobei letztere weit weniger wichtig ist als erstere).

1
Von Experte PhotonX bestätigt

klar, du startest mal mit "find . -type f", das findet dann alle Dateien.

Dann schickst Du das mit "|grep ..." durch ein oder mehrere grep, und filterst dabei die Liste so zusammen, dass nur die zu löschenden Dateien rauskommen.

Und wenn dir das Ergebnis gefällt, dann lässt du das ganze nochmal abschließend mit angehängtem "|xargs rm" laufen, um zu löschen.

Das könnte dann (aber vorher ohne xargs rm testen!) so aussehen:
find . -type f |grep -v test.344 |grep test. |xargs rm

Wenn die Datei- oder Verzeichnisnamen Leerzeichen o.ä. drin haben geht der letzte Schritt nicht so einfach.


PhotonX  25.08.2021, 07:19

Ja, das ist eleganter als ein Skript mit einer for-Schleife. :)

1

Du öffnest eine shell gehst in den Übergeordneten ordner: Befehl: cd

z.B. cd /home/l4ze3/daten/experimernt {Enter}

und dann den Befehl: rm -R mit *

also rm -R test.*

dann werden alle Dateien in allen Unterverzeichnissen die mit "test." anfangen gelöscht.

Für die Ausnahme: Da würde ich die Datei vorher umbenennen. :-)

Mit einem Skript kann man das sogar automatisierrn.

Woher ich das weiß:Hobby – arbeite mit Linux seit vielen Jahren
find . -type f \( -iname "test.*" ! -iname "test.344" \) -delete

Durchsucht alle Unterverzeichnisse nach Dateien (-type f) deren Name mit test. beginnt (-iname "test.*"), ignoriert dabei alle mit dem Namen test.344 (! -iname "test.344") und löscht diese (-delete).

Du kannst -delete weglassen um dir die betroffenen Dateien zuerst anzeigen zu lassen.