falkit
Goto Top

Dateien löschen außer die neuesten mit Hilfe von tail und xargs

Hi zusammen,
ich will jeden Abend ein Script laufen lassen, welches in verschiedenen Ordnern, alle Dateien bis auf die letzten 3 löscht. Der code den ich mir bisher zusammengebaut habe, funktioniert allerdings nur wenn ich mich in dem jeweiligen Verzeichnis befinde. Ich habe etwas rumprobiert, allerdings noch keine Lösung gefunden, bisher sieht der Code so aus:

ls -t /srv/www/ordner1/ordner2/ordner3/1111111 | tail -n +4 | xargs rm -r -f

Er soll also die anzahl der Dateien/Ordner in 1111111 abgefragt werden und dann alles ab der 4. neuesten gelöscht werden. Wie gesagt, befinde ich mich im Ordner 1111111 macht er das auch so wie er es soll, da es aber automatsich und nicht nur für einen Ordner ablaufen soll, muss ich beim löschen hinten noch etwas anfügen, was mir aber nicht einfallen will.

Danke schon mal

Falk

Content-Key: 230407

Url: https://administrator.de/contentid/230407

Printed on: April 19, 2024 at 13:04 o'clock

Member: ITvortex
ITvortex Feb 19, 2014 at 14:34:16 (UTC)
Goto Top
Hi,

rm -rf /ordner1/ordner2/usw./

meinst du das?

lg

ITvortex
Member: Cthluhu
Cthluhu Feb 19, 2014 at 15:19:51 (UTC)
Goto Top
Hi,

Du könntest noch ein find drüberstülpen. In etwas so:
find base_folder -type d -exec ls -t {} | tail -n +4 | xargs rm -r -f \;
Achtung: code ist ungetestet und soll nur als Vorschlag dienen.

mfg

Cthluhu
Member: FalkIT
FalkIT Feb 19, 2014 at 15:33:05 (UTC)
Goto Top
Hi Cthluhu,
das geht glaube ich ein bisschen an dem vorbei wie ich es haben will.
Das einzige was fehlt ist im grunde, dass er den letzten Befehl (xargs rm -r -f) im richtigen Verzeichnis ausführt. Ein cd davor in das jeweilige Verzeichnis bringt nichts, auch rm /Ordnerstruktur/Ordner/Ordner nicht.
Kann doch eigentlich nur eine Kleinigkeit sein die hier fehlt..
Member: Cthluhu
Cthluhu Feb 19, 2014 updated at 15:44:30 (UTC)
Goto Top
Ok, das hab ich falsch verstanden.
Wie siehts damit aus
 export FOLDER="/srv/www/ordner1/ordner2/ordner3/1111111"; ls -t $FOLDER | sed 's!^!$FOLDER/!' | xargs echo   
Der tail fehlt und rm hab ich mit echo ersetzt (dass nix schief geht).

Edit: Tippfehler im code entfernt:
Member: Lochkartenstanzer
Solution Lochkartenstanzer Feb 19, 2014, updated at Feb 20, 2014 at 09:45:49 (UTC)
Goto Top
Zitat von @FalkIT:

ich will jeden Abend ein Script laufen lassen, welches in verschiedenen Ordnern, alle Dateien bis auf die letzten 3 löscht.

moin,

  • Sollen insgesammt nur die letzten 3 übrigbleiben oder in jedem Ordner nur die letzten 3?
  • liegen diese ordner im gleichen unterordner?
  • sollen auch unterordner in dieses löschen mit einbezogen werden oder sollen nur gelöscht werden?
  • usw.

lks
Member: FalkIT
FalkIT Feb 19, 2014 at 16:12:35 (UTC)
Goto Top
Hi,

* Sollen insgesammt nur die letzten 3 übrigbleiben oder in jedem Ordner nur die letzten 3?
  • liegen diese ordner im gleichen unterordner?
  • sollen auch unterordner in dieses löschen mit einbezogen werden oder sollen nur gelöscht werden?
  • usw.

Die Struktur sieht so aus:
/Ordner1/Unterordner1/1111111/1111112
/Ordner1/Unterordner1/1111111/1111113
/Ordner1/Unterordner1/1111111/1111114
/Ordner1/Unterordner1/1111111/1111115
/Ordner1/Unterordner1/1111111/1111116
/Ordner1/Unterordner1/1111111/1111117
/Ordner1/Unterordner1/1111111/1111118
/Ordner1/Unterordner1/1111111/1111119

/Ordner1/Unterordner1/1111112/1111112
/Ordner1/Unterordner1/1111112/1111113
/Ordner1/Unterordner1/1111112/1111114
/Ordner1/Unterordner1/1111112/1111115
/Ordner1/Unterordner1/1111112/1111116
/Ordner1/Unterordner1/1111112/1111117
/Ordner1/Unterordner1/1111112/1111118
/Ordner1/Unterordner1/1111112/1111119

Es sollen in den Ordnern 1111111, 1111112, alleOrdner/Dateien gelöscht werden, außer 1111119, 1111118, 1111117 (wenn wir davon ausgehen dass diese drei die neusten sind).
Insgesamt gibt es 24 Ordner also 1111111 - 1111124, deren Inhalt jeweils bis auf die neuesten 3 gelöscht werden soll. Wenn es sich bei den zu löschenden Daten um Ordner handelt, soll der komplette Inhalt gelöscht werden, egal, was sich darin befindet.

Gruß

Falk
Member: FalkIT
FalkIT Feb 19, 2014 at 16:13:15 (UTC)
Goto Top
Hi,
 export FOLDER="/srv/www/ordner1/ordner2/ordner3/1111111"; ls -t $FOLDER | sed 's!^!$FOLDER/!' |  
> xargs echo 
Der tail fehlt und rm hab ich mit echo ersetzt (dass nix schief geht).

werde ich ausprobiere, wenn ich wieder an die entsprechende Maschine ran komme, vielen Dank schonmal!


Falk
Member: Cthluhu
Cthluhu Feb 19, 2014 at 16:21:39 (UTC)
Goto Top
Zitat von @FalkIT:
werde ich ausprobiere, wenn ich wieder an die entsprechende Maschine ran komme, vielen Dank schonmal!
Probier das lieber nicht an der life-Maschine, sondern an einem experimentellen Datenbaum.
Member: Lochkartenstanzer
Solution Lochkartenstanzer Feb 19, 2014, updated at Feb 20, 2014 at 09:45:43 (UTC)
Goto Top
Zitat von @FalkIT:

Es sollen in den Ordnern 1111111, 1111112, alleOrdner/Dateien gelöscht werden, außer 1111119, 1111118, 1111117 (wenn
wir davon ausgehen dass diese drei die neusten sind).
Insgesamt gibt es 24 Ordner also 1111111 - 1111124, deren Inhalt jeweils bis auf die neuesten 3 gelöscht werden soll. Wenn es
sich bei den zu löschenden Daten um Ordner handelt, soll der komplette Inhalt gelöscht werden, egal, was sich darin
befindet.

Mein Einzeiler-Quickshot:

echo "#!/bin/bash" > /tmp/scratchfile-xyz.sh ; ls -d /Ordner1/Unterordner1/* | xargs -l1 -I XXXX echo "ls -td XXXX |   tail -n +4 | xargs rm -r -f" >> /tmp/scratchfile-xyz.sh ; source /tmp/scratchfile-xyz.sh

Eventuell kannst Du ja das rm erstmal mit "echo" entschärfen", um zu sehen, ob die "richtigen" Objekte gelöscht werden. u.u. müssen da auch noch einige sudos eingestreut werden.

lks

nachtrag: bei meinem Einzeier werden in jedem der 24 ordner die drei neuesten übriggelassen.

nachtrag2: Wenn Du insgesammt nur die 3 neuesten übriglassen willst, reicht auch:

 ls -td /Ordner1/Unterordner1/*/*  | tail -n +4 | xargs rm -r -f
Member: VooDoo4711
Solution VooDoo4711 Feb 19, 2014, updated at Feb 20, 2014 at 09:45:40 (UTC)
Goto Top
Hallo Falk,

probier mal folgendes Konstrukt aus ;)

find /tmp -type f -printf '%T@ %p\n' | sort -nr | cut -d " " -f2 | tail -n +4 | xargs rm -r -f

Die Zeile sucht in /tmp alle Files (für Files und Directories das "-type f" weg lassen) und gibt sie mit ihrer Modification-Time und komplettem Pfad aus (das war Dein Knackpunkt),
dann werden die gefundenen Dateien umgekehrt und numerisch sortiert,
dann schneiden wir nur die Pfade raus und werfen die Timestamps weg,
dann "verschonen" wir Deine gewünschte Anzahl von Dateien
und zuletzt kommt das "rm" zu Zug.

Das sollte es dann gewesen sein ;)

Hoffe das hilft Dir weiter. Ich hab's nicht großartig getestet - also VORSICHT!

Nachtrag: Oder Du nimmst die schöne(re) Zeile von Lochkartenstanzer face-smile
Member: FalkIT
FalkIT Feb 20, 2014 at 09:46:55 (UTC)
Goto Top
Danke für die verschiedenen Lösungen!
Aus faulheit, habe ich die Lösung von VooDoo genutzt face-big-smile
Werde mich aber wenn es noch mal schöner sein soll an den Thread hier erinnern.

Vielen Dank!

Falk