# Dateien in geschachteltem Verzeichnis löschen



## xrax (7. April 2014)

Hallo zusammen,

ich möchte auf einem Debian-Server alle Dateien löschen die älter als x Wochen sind.
Die Dateien befinden sich in mehreren Ordnern welche Unterordner eines Hauptordners sind.

Ich bekomme das mit Datum und Unterordner nicht auf die Reihe.

Weiss jemand Rat ?

Besten Dank
xrax


----------



## vfl_freak (7. April 2014)

Moin,

wie schaut denn Dein Ansatz bisher aus 

Gruß
Klaus


----------



## xrax (8. April 2014)

Hallo VFL,

find /var/parent -mtime +7 -exec rm {} \;
Das würde mir alles in parent löschen was älter als 7 Tage ist.

Ich kann auch mit 
ls /var/parent -R 
die Unterverzeichnisse finden.

Ich möchte aber die files die älter als 7 Tage sind aus diesen Unterverteichnissen löschen.

Besten Dank
xrax


----------



## deepthroat (8. April 2014)

Hi.

Irgendwie ist mir noch unklar was du eigentlich willst bzw. wo dein Problem ist.

find arbeitet rekursiv, d.h. es werden bei deinem Kommando alle Dateien in allen Unterverzeichnissen und auch die Unterverzeichnisse selbst, die älter sind als 7 Tage gelöscht.

Was möchtest du denn jetzt löschen?


----------



## xrax (8. April 2014)

deepthroat hat gesagt.:


> Hi.
> 
> find arbeitet rekursiv, d.h. es werden bei deinem Kommando alle Dateien in allen Unterverzeichnissen und auch die Unterverzeichnisse selbst, die älter sind als 7 Tage gelöscht.
> 
> Was möchtest du denn jetzt löschen?



Aha, auch in den Unterverzeichnissen. Das war mir nicht klar.
Danke für die Antwort.

gruß
xrax


----------



## Thinker (12. April 2014)

xrax hat gesagt.:


> find /var/parent -mtime +7 -exec rm {} \;
> Das würde mir alles in parent löschen was älter als 7 Tage ist.



Der Aufruf hat so derzeit ein paar Probleme: Er findet (und löscht) auch Sachen, die keine Dateien sind, und er hat Probleme mit Leerzeichen im Dateinamen. Das geht so weit, daß er die falschen Dateien löschen würde. 

Ich würds daher so schreiben: 

```
find /var/parent -mtime +7 -type f -print0 |xargs -0 rm
```

Alternativ kann man wohl auch 

```
find /var/parent -mtime +7 -type f -delete
```

schreiben, wenn man ohne die Pipe auskommen mag.


----------



## xrax (12. April 2014)

ok, sagt mir leider alles nicht viel. Will sagen, ich kann die Lösungen nicht bewerten.
Wo kann ich denn sowas nachlesen/lernen ? 

Besten Dank
xrax


----------



## Thinker (12. April 2014)

xrax hat gesagt.:


> ok, sagt mir leider alles nicht viel. Will sagen, ich kann die Lösungen nicht bewerten.
> Wo kann ich denn sowas nachlesen/lernen ?



Die Manpage von find ( "man find" auf der Konsole eintippen) ist sehr umfangreich und leicht zu lesen, meiner Meinung nach. 

Zur Erläuterung: Wenn du in einem Verzeichnis drei Dateien "A", "B" sowie "A B" hast und dein Find-Aufruf nur "A B" löschen soll, dann würde er

```
rm A B
```
aufrufen. Und rm löscht dann "A" sowie "B". Nicht wie gedacht, oder?

Das umgehe ich, indem ich find mit -print0 aufrufe, damit gibt mir find die Dateinamen als sogenannte nullterminierte Strings aus, also ein besonderes Zeichen am Ende jedes Dateinamens. "xargs -0 rm" ruft nun für jeden nullterminierten String rm auf. Damit sind auch Leerzeichen im Dateinamen kein Problem mehr. 

Zum Thema "löscht mehr weg": Unter Linux ist alles eine Datei. Deswegen findet dein find-ausdruck eventuell auch Verzeichnisse. Die werden zwar nicht gelöscht, weil rm da einen Sicherheitsmechanismus hat, aber eine Fehlermeldung wird es trotzdem geben. Der Find-Ausdruck "-type f" filtert alles bis auf "reguläre Dateien".  Auch hier ist die Manpage von find sehr informativ, was neben normalen Dateien alles in einem Linux-Dateisystem herumliegen kann…

Ich hoffe, ich konnte ein wenig helfen.


----------

