• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Selektives Löschen mit rm

Azador

Newbie
Hallo,

ich hab folgendes Problem,

ich hab (alle Zeiten mal wiederkehrend) 100 Ordner in denen ich immer dieselben Dateien (vom Namen her) löschen muss, so dass zum Schluss fünf Dateien übrig bleiben. Kann ich mit einem "rm" spezielle Dateien ausklammern, so dass eben die gewünschten übrig bleiben?

Danke schon mal.
 
Deiner Problembeschreibung ist leider nicht zu entnehmen woran Du die 5 Dateien festmachen willst. Denn wenn alle Dateien in den 100 Ordnern gleich sind, wirst Du nichts selektieren können, es gibt bei rm keine Möglichkeit die Anzahl der zu löschenden Dateien festzulegen.
 
OP
A

Azador

Newbie
sorry, geb ich zu etwas sehr blöd ausgedrückt.

Mit 100 gleichen Dateien wollte ich sagen, dass in jedem Ordner die gleichen Dateien sind. Die Dateien unterscheiden sich natürlich namentlich, haben aber alle die gleiche Endung.

Also *.plt z.B
Jetzt würd ich gern fünf bestimmte Dateien pro Ordner behalten, den Rest löschen. Den Namen weiß ich natürlich, von denen die ich behalten will.

Leider kommt noch (vielleicht) ein weiteres Problem hinzu. Die Dateien haben zwei Punkte im Namen. Sie heißen z.B.

"Ref.Beobachter.plt"
Ich weiß nicht ob der zweite Punkt ein Problem darstellt oder nicht.
 
A

Anonymous

Gast
Azador schrieb:
Sie heißen z.B.

"Ref.Beobachter.plt"
Ich weiß nicht ob der zweite Punkt ein Problem darstellt oder nicht.

Punkte wieviele auch immern, sind überhaupt kein Problem, (eventuelle Ausnahme, ein Punkt am Anfang der die Datei nicht immer sofort sichtbar erscheinen läßt) Problematisch sind dagegen Leerzeilen im Dateinamen.

mit rm selbst selektiv zu löschen ist so einfach nicht, wenn man es nicht 100% am Namen festmachen kann, Du brauchst eine Klare Regel. ZB alle Dateien die an der 3 Stelle ein a , b oder c haben und auf xyz enden, bleiben erhalten alles andere löschen. Versuche dazu sind jedoch recht gefählich, da dann nicht selten gleichmal alle Dateien weg sind. Also die Finger vorerstmal von dieser Methode lassen, und lieber erst mit ls anstatt rm probieren, bis das Ergebnis ok ist. Erst dann ls durch rm ersetzen (eventuell sind auch einige Optionen zu ändern)

Andere Möglichkeiten gibt es einige, allerdings ist es von Interesse ob das jetzt jeden Tag oder nur einmalig gemacht werden muss, und ob sich die Dateinamen immer ändern können, Je nach dem kann man dann den Aufwand einschätzen, denn man investieren will.

1. ZB einmalig und dann nie wieder.
Die Dateien die du behalten willst, unlöschbar machen .( Achtung ! nur das Schreibrecht auf die Dateien entfernen hilf gar nichts) Dann einfach alle Dateien löschen, die unlöschbaren bleiben übrig.
Dieserart gibt es bestimmt mehere lustige Umgehungen des Problems.

2. ZB mehrmals aber nur gelegentlich, die Dateinamen könnten sich ständig ändern.
Alle Dateien in allen Verzeichnissen mittels find in eine Datei schreiben.
mit dieser Datei kann jetzt entweder experimentiert werden wie die zu behaltenden ausgefiltert werden können, oder gleich alle Dateien die du behalten willst manuell herauslöschen. Das ERgebnis ist dann eine Datei die die Namen aller Dateien enthält die gelöscht werden sollen. Diese kannst du nochmal prüfen, und dann wird der Inhalt dieser Datei rm übergeben.

3. ZB. Täglich vollautomatisch immer gleiches Muster oder Muster das du an Datum Uhrzeit oä. automatisch festmachen kannst.
Das wird dann ein etwas komplexes kleines Script oft voller mit |Tz€LPri%e|. Dazu müssten aber die genauen Dateinamen und die Unterschiede usw. absolut klar von dir Definiert werden, damit wir dir helfen könnten.

......

robi
 
Ich würde vielleicht einen anderen Ansatz wählen.
- Neuen Ordner erstellen. ( Aber auf dem gleichen Filesystem )
- die fünf erwünschten Dateien dort mit einem Hardlink hinpacken.
ln deleteordner/dateibehalten behalteordner/dateibehalten
ln deleteordner/dateibehalten.1 behalteordner/dateibehalten.1
ln deleteordner/dateibehalten.2 behalteordner/dateibehalten.2
ln deleteordner/dateibehalten.3 behalteordner/dateibehalten.3
ln deleteordner/dateibehalten.4 behalteordner/dateibehalten.4

Jetzt kannst du hingehen und den ganzen Inhalt von deleteordner/* löschen.
Da noch ein _hard_link existiert bleibt die Datei in behalteordner/... erhalten.
Achtung: geht _nicht_ mit symbolischen Links ( ln -s )

Haveaniceday

PS: Alternativer Vorschlag:
find deleteordner/ -name "...." -print | grep -v -e "dateibehalten.1" -e "dateibehalten.2" .. | xargs rm
 

regexer

Advanced Hacker
Falls ich die Aufgabe richtig verstanden habe, müsste es doch viel einfacher gehen. Beispiel: Lösche alle Dateien aus dem aktuellen Verezeichnis, die nicht "datei1" oder "datei3" (dem rm stelle ich zur Sicherheit ein echo voran):
Code:
find . -type f ! -name datei1 ! -name datei3 -exec echo rm {} \;
 
Oben