Mehrere Millionen Dateien nach Datum löschen

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
Transmitter
Beiträge: 262
Registriert: 21.01.2005 15:17:06

Mehrere Millionen Dateien nach Datum löschen

Beitrag von Transmitter » 18.03.2013 09:28:23

Hallo,

ich habe einige Dateien (session Dateien die nicht von der Software entfernt wurden):

Code: Alles auswählen

ls | wc -l
2507278
Jetzt würde ich gerne die, die schon etwas älter sind löschen:

Code: Alles auswählen

find /var/www/var/session/ -name 'sess_*' -type f -mtime +7 -exec rm {} \;
aber leider:

Code: Alles auswählen

find: Konnte keinen neuen Prozess starten.: Nicht genügend Hauptspeicher verfügbar
Habe jetzt mit mv ../session/sess_11* . je ca. 10.000 Stück in ein anderes Verzeichnis verschoben und dann bei 50.000 Stück gelöscht. Dauert aber ca. 40 min auf diese Weiße (für die 50t).
Gibt es da eine bessere Möglichkeit?

Danke schon mal
Bye, Transmitter

Liffi
Beiträge: 2346
Registriert: 02.10.2004 01:33:05

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Liffi » 18.03.2013 09:54:00

Kannst du die Dateinamen mal in eine Datei schreiben statt sie mit exec rm zu löschen?
Dann kannst du (hoffentlich) über die Dateinamen gehen und sie löschen.

pferdefreund
Beiträge: 3800
Registriert: 26.02.2009 14:35:56

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von pferdefreund » 18.03.2013 10:01:06

Oder, wenn es viel weniger neue sind, die auf diese Art in ein anderes Verzeichnis verschieben ,
das Verzeichnis killen, neu anlegen und zurückschieben.

Benutzeravatar
4A4B
Beiträge: 981
Registriert: 09.11.2011 11:19:55
Kontaktdaten:

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von 4A4B » 18.03.2013 10:15:59


uname
Beiträge: 12489
Registriert: 03.06.2008 09:33:02

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von uname » 18.03.2013 10:25:51

Ich denke auch xargs wird helfen. Vielleicht so:

Code: Alles auswählen

find /var/www/var/session/ -name 'sess_*' -type f -mtime +7 |xargs -i echo {} 
Dann "echo" durch "rm" ersetzen wenn die Liste korrekt ist. Dein Befehl war schön etwas gemein für dein System ;-)

Transmitter
Beiträge: 262
Registriert: 21.01.2005 15:17:06

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Transmitter » 18.03.2013 12:04:18

Habe alle Möglichkeiten probiert, aber es stößt immer an den RAM.

echo in eine Datei, nur die neuen Dateien verschieben, das sowohl mit exec als auch xargs (wobei xargs besser ist - danke für den Link).

Wenn ich xargs + rm nehme, dann wird es wenigstens zum Teil ausgeführt:

Code: Alles auswählen

ls | wc -l
2481951
find /var/www/var/session/ -name 'sess_*' -type f -mtime +7 |xargs -i rm {} 
xargs: cannot fork: Nicht genügend Hauptspeicher verfügbar
ls | wc -l
2482002
Sollte ich das find einfach alle 10 min in einen cron job packen und es über Nacht laufen lassen? Ist das eine gute Idee?

Benutzeravatar
shoening
Beiträge: 918
Registriert: 28.01.2005 21:05:59
Lizenz eigener Beiträge: MIT Lizenz

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von shoening » 18.03.2013 12:32:08

Hi,

vielleicht kannst Du erst mal alle Dateinamen in eine Datei schreiben, die dann z.B. mit split -l 1000 in kleinere Einheiten zerlegen
und dann die diese kleinen Einheiten mit

Code: Alles auswählen

cat <dateiname> | xargs -i rm
loeschen. Wobei das dann z.B. in einer Schleife über alle mit split erzeugten Dateien läuft.

Ciao
Stefan
Bürokratie kann man nur durch ihre Anwendung bekämpfen.

Liffi
Beiträge: 2346
Registriert: 02.10.2004 01:33:05

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Liffi » 18.03.2013 18:49:59

Transmitter hat geschrieben:Habe alle Möglichkeiten probiert, aber es stößt immer an den RAM.
echo in eine Datei, nur die neuen Dateien verschieben, das sowohl mit exec als auch xargs (wobei xargs besser ist - danke für den Link).
Kein echo in die Datei sondern mit '>'. Das sollte eigentlich passen (kann es aber mangels Datenmenge nicht nachvollziehen).

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Natureshadow » 18.03.2013 21:48:11

Code: Alles auswählen

find /var/www/var/session -name "sess_*" -mtime +7 -print0 | while IFS= read -r -d '' file; do rm "$file"; done
Das ist die einzige sichere Art, mit der Ausgabe von find umzugehen (Leerzeichen, newline in Dstrinamen…). In dem Fall vielleicht nicht ganz so wichtig, aber eine gute Angewohnheit.

Aber wenn du schon find benutzt, warum dann nicht:

Code: Alles auswählen

find /var/www/var/session -name "sess_*" -mtime +7 -delete
? find kann selber löschen, kein Grund, haufenweise Shells zu forken.

Beide Lösungen hier funktionieren und sind wesentlich weniger abartig als die bisherigen. Ich würde die obere bevorzugen, weil find mysteriös ist.

EDIT: Hier noch ein Beispiel ganz ohne find:

Code: Alles auswählen

tmp=$(mktemp); touch -d '-7 days' "$tmp"; for i in /var/www/var/session/*; do [[ "$i" -nt "$tmp" ]] || rm "$i"; done; rm "$tmp"
Wie immer alle drei Beispiele ungetestet vom Handy, keine Haftung ;).

Transmitter
Beiträge: 262
Registriert: 21.01.2005 15:17:06

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Transmitter » 19.03.2013 10:51:10

Super ..

Code: Alles auswählen

find /var/www/var/session -name "sess_*" -mtime +7 -print0 | while IFS= read -r -d '' file; do rm "$file"; done
Scheint die "schlankeste" Variante zu sein. Sie löscht ca. 200.000 - 500.000 Dateien bis der Speicher voll läuft - dauert pro Lauf ca. 1h oder länger.
Das lasse ich jetzt einfach einmal pro Nacht laufen und in einer Woche sollte sich das Problem erledigt haben. :)

Danke euch.

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Natureshadow » 19.03.2013 12:26:06

Wieso sollte da der Speicher voll laufen? Das kann nicht sein.

Wenn das passiert, ist dein System kaputt.

-nik

wanne
Moderator
Beiträge: 7623
Registriert: 24.05.2010 12:39:42

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von wanne » 19.03.2013 12:58:37

Natureshadow hat geschrieben:Wieso sollte da der Speicher voll laufen? Das kann nicht sein.
find braucht auch einiges an Speicher. Wenn er nur ein paar MiB hat killt's ihm das System. Eine andere Möglichkeit ist, dass ihm etwas ganz anderes den Speicher zumüllt und es ihm dann mehr oder weniger zufällig der Befehl gekillt wird, wenn find mal wider das Fass zum überlaufen bringt.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
Natureshadow
Beiträge: 2157
Registriert: 11.08.2007 22:45:28
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Radevormwald
Kontaktdaten:

Re: AW: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Natureshadow » 19.03.2013 13:15:07

Naja, da oben steht ja auch eine Losung ohne find …

wanne
Moderator
Beiträge: 7623
Registriert: 24.05.2010 12:39:42

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von wanne » 19.03.2013 14:01:48

Wie effizent die shell da arbeitet weiß ich nicht. Zumindest die Dateinamen+Pfade wird's alle auf einmal im Speicher halten Wenn's dumm läuft sogar die 256 Byte pro Dateinamen, die readdir zurück gibt. (Das sind dann 512MiB.) Ohne C-Kenntnisse ist mehr aber auch nicht drin.
rot: Moderator wanne spricht, default: User wanne spricht.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Cae » 19.03.2013 15:30:46

Vielleicht ist die Loesung gegen knappen Speicher einfach 'ne Swapfile. Dadurch steht "mehr Speicher" zur Verfuegung, und finds malloc() kann froehlich allozieren. Oder wer auch immer Speicher fuer Dateinamen braucht.

Ausprobieren:

Code: Alles auswählen

# truncate -s 2G /var/swapfile # sparse file mit Maximalgroese 2 GB erstellen
# chmod 600 /var/swapfile
# mkswap -f /var/swapfile
# swapon /var/swapfile
# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/var/swapfile                           partition       2097148 0       -1        # [1]
# 
Abschalten tut man das mit swapoff und dann kann man die Datei einfach mit rm entfernen.

Gruss Cae

--Edit: dd durch truncate ersetzt.

[1] ja, ich hab's gefakt. Sollte aber so aehnlich aussehen.
Zuletzt geändert von Cae am 19.03.2013 16:41:34, insgesamt 1-mal geändert.
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

wanne
Moderator
Beiträge: 7623
Registriert: 24.05.2010 12:39:42

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von wanne » 19.03.2013 15:39:48

Code: Alles auswählen

dd of=/var/swapfile seek=2G bs=1 count=0
Ist effizeinter als

Code: Alles auswählen

dd of=/var/swapfile if=/dev/zero bs=2G count=1
Das gilt insbesondere für moderene Dateisysteme und vor allem braucht es keine 2G RAM.
rot: Moderator wanne spricht, default: User wanne spricht.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Mehrere Millionen Dateien nach Datum löschen

Beitrag von Cae » 19.03.2013 16:38:40

wanne hat geschrieben:

Code: Alles auswählen

dd of=/var/swapfile seek=2G bs=1 count=0
Ist effizeinter als

Code: Alles auswählen

dd of=/var/swapfile if=/dev/zero bs=2G count=1
Das gilt insbesondere für moderene Dateisysteme und vor allem braucht es keine 2G RAM.
Hups, ich wollte bs= doch eigentlich nicht so gross machen... Naja. Aber wo du's gerade ansprichst: Dann kann ich gleich truncate empfehlen:

Code: Alles auswählen

# truncate -s 2G /var/swapfile
. Ich editier' das gleich oben rein.

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten