Alle Dateien löschen mit bestimmten Namen in Linux?
Moin
Angenommen ich hab viele dateien in verschiedenen ordnern mit "test" im namen. Gibt es eine möglichkeit alle dateien die den namen "test" behinhalten zu löschen?
Und geht es auch mit ausnahmen?
Also wenn ich in verschiedenen verzeichnissen dateien mit dem namen "test.1" "test.2" "test.3" und so habe alle dateien zu löschen bis auf die "test.344"?
Wie ich dateien aufspüren kann weiß ich, ich möchte gerne wissen wie man diese bestimmten dateien löschen kann
5 Antworten
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.
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
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.
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.
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.
Elegant, aber wenig robust: Wehe man macht im Teil [...] irgend einen Flüchtigkeitsfehler.