Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[SHELL-SCRIPT] Die älteste Datei löschen
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German)
View previous topic :: View next topic  
Author Message
Pegasus87
Guru
Guru


Joined: 09 Sep 2004
Posts: 373

PostPosted: Sun Jan 01, 2006 10:13 pm    Post subject: [SHELL-SCRIPT] Die älteste Datei löschen Reply with quote

Hallo,

ich suche einen Shell-Script, der mir die älteste Datei aus einem Verzeichnis sucht und löscht, bevor eine neue angelegt wird.
Bsp.: Ich habe einen Script, der mir mit tar Backups von Verzeichnissen anlegt. Nun sollen immer die 5 letzten Backups gespeichert werden und bevor ein neues Backup angelegt wird (also das Script ausgeführt wird), das älteste Backup gelöscht werden.

Im Prinzip ganz einfach, aber wie kann man das umsetzen?

Hat jemand eine Idee? Oder noch eine Frage?

Danke für eure Hilfe!
Back to top
View user's profile Send private message
SinoTech
Advocate
Advocate


Joined: 20 Mar 2004
Posts: 2579
Location: Neunkirchen / Saarland / Germany

PostPosted: Sun Jan 01, 2006 10:20 pm    Post subject: Reply with quote

Einfach den "-t" switch von ls benutzen, welcher die Ausgabe nach dem Alter der Dateien sortiert (von der jüngsten (oben) zu der ältesten (unten)), sowie den "-1" switch (eins). Der "-1" switch listet die Dateien untereinander auf (Ähnlich zu "-l" (klein L), welches aber noch zusätzlichen die Größpe, Besitzer etc. ausgibt).
Code:

$ ls -1t --color=none | tail -n 1 | xargs rm -rf


Mfg

Sino
Back to top
View user's profile Send private message
STiGMaTa_ch
Veteran
Veteran


Joined: 28 Dec 2004
Posts: 1686
Location: Rüti ZH / Schweiz

PostPosted: Sun Jan 01, 2006 10:25 pm    Post subject: Reply with quote

Code:
for a in `ls -1t`;do AeltesteDatei=$a;done
rm $AeltesteDatei


#Edit
SinoTech war schneller... :)

Lieber Gruss
STiGMaTa
Back to top
View user's profile Send private message
Pegasus87
Guru
Guru


Joined: 09 Sep 2004
Posts: 373

PostPosted: Sun Jan 01, 2006 10:28 pm    Post subject: Reply with quote

SinoTech wrote:
Einfach den "-t" switch von ls benutzen, welcher die Ausgabe nach dem Alter der Dateien sortiert (von der jüngsten (oben) zu der ältesten (unten)), sowie den "-1" switch (eins). Der "-1" switch listet die Dateien untereinander auf (Ähnlich zu "-l" (klein L), welches aber noch zusätzlichen die Größpe, Besitzer etc. ausgibt).
Code:

$ ls -1t --color=none | tail -n 1 | xargs rm -rf


Mfg

Sino

Vielen dank, das wars, was ich suchte :D
Back to top
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Sun Jan 01, 2006 10:33 pm    Post subject: Reply with quote

$ ls -1t -A --color=none | tail -n 1 | xargs rm -rf


Würde ich noch vorschlagen, man beachte das -A. ;-)

Bye.
_________________
GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code:
perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);'
Back to top
View user's profile Send private message
SinoTech
Advocate
Advocate


Joined: 20 Mar 2004
Posts: 2579
Location: Neunkirchen / Saarland / Germany

PostPosted: Sun Jan 01, 2006 11:19 pm    Post subject: Reply with quote

Nice, "-A" habe ich noch nicht gekannt .. naja, man kann schließlich auch nicht jeden switch kennen :).

Mfg

Sino
Back to top
View user's profile Send private message
Pegasus87
Guru
Guru


Joined: 09 Sep 2004
Posts: 373

PostPosted: Mon Jan 02, 2006 11:46 am    Post subject: Reply with quote

Noch eine Frage:

Wenn ich das jetzt mit
Code:
 ls -1t -A --color=none | tail -n 1 | xargs rm -rf
mache, funktioniert das ja schon ganz gut, aber es wird immer die älteste Datei gelöscht, egal wieviele im Verzeichnis sind.

Wie müsste eine Schleife aussehen, die zunächst überprüft, ob z.B. mindestens 3 Dateien vorhanden sind und nur dann löscht?
Back to top
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Mon Jan 02, 2006 11:54 am    Post subject: Reply with quote

Was für einen Sinn würde das machen?
Aber okay:
Code:
[ $(ls -A | wc -l) -ge 3 ] && ls -1t -A --color=none | tail -n 1 | xargs rm -rf

Bye.
_________________
GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code:
perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);'
Back to top
View user's profile Send private message
Pegasus87
Guru
Guru


Joined: 09 Sep 2004
Posts: 373

PostPosted: Mon Jan 02, 2006 12:00 pm    Post subject: Reply with quote

hagbard_ wrote:
Was für einen Sinn würde das machen?
Aber okay:
Code:
[ $(ls -A | wc -l) -ge 3 ] && ls -1t -A --color=none | tail -n 1 | xargs rm -rf

Bye.


Danke, funktioniert!

Sinn ist folgender:

Es sollen in dem Verzeichnis immer die letzten 3 Backups einer Datei vorhanden sein.
Wenn nun ein User eine Backupdatei gelöscht hat und somit nur noch 2 da sind, soll natürlich eine dritte Datei erstellt werden und nich eine gelöscht und eine erstellt werden, so dass man wieder bei 2 Dateien wäre. Deshalb die Überprüfung.
Back to top
View user's profile Send private message
monade
Apprentice
Apprentice


Joined: 17 Mar 2005
Posts: 204
Location: Berlin

PostPosted: Mon Jan 02, 2006 1:12 pm    Post subject: Reply with quote

hagbard_ wrote:
Code:
[ $(ls -A | wc -l) -ge 3 ] && ls -1t -A --color=none | tail -n 1 | xargs rm -rf

Nur aus Interesse: für was ist die die --color-Angabe notwendig?

monade
Back to top
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Mon Jan 02, 2006 1:36 pm    Post subject: Reply with quote

Des woiss i au nit, oba mei Vorgänger ham des so vorgeschloge. ;-)

Bye.
_________________
GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code:
perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);'
Back to top
View user's profile Send private message
Pegasus87
Guru
Guru


Joined: 09 Sep 2004
Posts: 373

PostPosted: Mon Jan 02, 2006 1:49 pm    Post subject: Reply with quote

monade wrote:
hagbard_ wrote:
Code:
[ $(ls -A | wc -l) -ge 3 ] && ls -1t -A --color=none | tail -n 1 | xargs rm -rf

Nur aus Interesse: für was ist die die --color-Angabe notwendig?

monade


Damit kannste die Ausgabe einfärben, damits hübscher aussieht:

MAN-Page:

--color[=WANN]
Kontrolle wann Farbe zum unterscheiden der Datei- typen eingesetzt wird. WANN kann never, always oder auto
sein.
Back to top
View user's profile Send private message
Anarcho
Advocate
Advocate


Joined: 06 Jun 2004
Posts: 2970
Location: Germany

PostPosted: Mon Jan 02, 2006 2:22 pm    Post subject: Reply with quote

hagbard_ wrote:
Was für einen Sinn würde das machen?
Aber okay:
Code:
[ $(ls -A | wc -l) -ge 3 ] && ls -1t -A --color=none | tail -n 1 | xargs rm -rf

Bye.


Wenn du immer wieder auf 3 zurück willst, egal wieviele Dateien drin sind:

Code:
while [ $(ls -A | wc -l) -ge 3 ]; do ls -1tA --color=none | tail -n 1 | xargs rm -rf; done

_________________
...it's only Rock'n'Roll, but I like it!
Back to top
View user's profile Send private message
Earthwings
Bodhisattva
Bodhisattva


Joined: 14 Apr 2003
Posts: 7753
Location: Germany

PostPosted: Mon Jan 02, 2006 2:55 pm    Post subject: Reply with quote

Sollte noch erwähnt werden, dass Verzeichnisse und Dateien mit Sonderzeichen (Leerzeichen etc.) Probleme machen werden.

@Anarcho: Das wird aber ne Endlosschleife, wenn drei Verzeichnisse in dem Ordner sind oder das Löschen aus anderem Grund fehlschlägt, oder arg langsam, falls eine sehr große Zahl Dateien vorhanden ist...
_________________
KDE
Back to top
View user's profile Send private message
Anarcho
Advocate
Advocate


Joined: 06 Jun 2004
Posts: 2970
Location: Germany

PostPosted: Mon Jan 02, 2006 3:11 pm    Post subject: Reply with quote

Earthwings wrote:
Sollte noch erwähnt werden, dass Verzeichnisse und Dateien mit Sonderzeichen (Leerzeichen etc.) Probleme machen werden.

@Anarcho: Das wird aber ne Endlosschleife, wenn drei Verzeichnisse in dem Ordner sind oder das Löschen aus anderem Grund fehlschlägt, oder arg langsam, falls eine sehr große Zahl Dateien vorhanden ist...


Also den Fall mit den 3 Verzeichnissen kann ich nicht nachvollziehen:

Code:
workstation test $ ll
insgesamt 0
workstation test $ mkdir ordner1
workstation test $ mkdir ordner2
workstation test $ mkdir ordner3
workstation test $ ll
insgesamt 12K
drwxr-xr-x  2 maz network 4,0K  2. Jan 16:01 ordner1
drwxr-xr-x  2 maz network 4,0K  2. Jan 16:01 ordner2
drwxr-xr-x  2 maz network 4,0K  2. Jan 16:01 ordner3
workstation test $ while [ $(ls -A | wc -l) -ge 3 ]; do ls -1tA --color=none | tail -n 1 | xargs rm -rf; done
workstation test $ ll
insgesamt 8,0K
drwxr-xr-x  2 maz network 4,0K  2. Jan 16:01 ordner2
drwxr-xr-x  2 maz network 4,0K  2. Jan 16:01 ordner3
workstation test $


Das mit dem Fehlschlagen des Löschens kann in der Tat passieren, aber das kann man dann durch eine kleine Änderung beheben:

Code:
 FTEST=""; while [ $(ls -A | wc -l) -ge 3 -a "$FTEST" == "" ]; do ls -1tA --color=none | tail -n 1 | xargs rm -rf 2>/dev/null || FTEST="y"; done

_________________
...it's only Rock'n'Roll, but I like it!
Back to top
View user's profile Send private message
Earthwings
Bodhisattva
Bodhisattva


Joined: 14 Apr 2003
Posts: 7753
Location: Germany

PostPosted: Mon Jan 02, 2006 3:19 pm    Post subject: Reply with quote

Ja, hast recht, rm -rf macht ja auch Ordner platt. Womit ein neues Problem entsteht: Wenn eine Datei names "/ foo" im Ordner existiert, wird dank fehlenden Quotes der Inhalt der gesamten Festplatte gelöscht. IMHO sollte man rm -rf *nie* in einem Skript benutzen.
_________________
KDE
Back to top
View user's profile Send private message
Anarcho
Advocate
Advocate


Joined: 06 Jun 2004
Posts: 2970
Location: Germany

PostPosted: Mon Jan 02, 2006 3:53 pm    Post subject: Reply with quote

Earthwings wrote:
Ja, hast recht, rm -rf macht ja auch Ordner platt. Womit ein neues Problem entsteht: Wenn eine Datei names "/ foo" im Ordner existiert, wird dank fehlenden Quotes der Inhalt der gesamten Festplatte gelöscht. IMHO sollte man rm -rf *nie* in einem Skript benutzen.


Ist ja gut. Das -rf kommt nicht von mir, ich habe nur die while-schleife drum gesetzt. Aber wenn du es ganz genau haben willst:

Code:
#!/usr/bin/perl

$count = 0;
$ls=`ls -1tA`;

@files = split("\n",$ls);

$max = @files;

print "No. of Files: ".$max."\n";

for ($i=0;$i<$max;$i++) {
        $count++;
        if ($count >= 3) {
                print "DEL: ".$files[$i]."\n";
                system(sprintf("rm -rf '%s'",$files[$i]));
        } else {
                print $files[$i]."\n";
        }
}


Dann machen wir eben ein Perl-Script draus! Dann ist zwar immer noch das -rf drin, aber zumindest sind jetzt leerzeichen egal. Wenn man weiss das nur dateien als Backup da sind, dann sollte man das rf löschen (und vielleicht noch die Verzeichnisse rausfiltern).
_________________
...it's only Rock'n'Roll, but I like it!
Back to top
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Mon Jan 02, 2006 3:57 pm    Post subject: Reply with quote

Oha, das ist aber kein Shellscript mehr oder? Sondern Perl. *g*
Kann ja jemand nach SH/Bash portieren, bin grad zu faul.

Bye.
_________________
GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code:
perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);'
Back to top
View user's profile Send private message
Deever
Veteran
Veteran


Joined: 06 Jul 2002
Posts: 1354
Location: Zürich / Switzerland

PostPosted: Mon Jan 02, 2006 4:18 pm    Post subject: Reply with quote

Oje, bitte verzeiht, daß ich an dieser Stelle nicht viel früher eingeschritten bin! Schade um die vielen, unnötigen Tastenanschläge!
Folgendes Kommando löst Pegasus87's Problem:
Code:
$ rm /ver/zeich/nis/*(.Om[1])

Dies setzt natürlich voraus, daß man die Z-Shell benutzt, was aber auch zu empfehlen ist. Die Bash mag zum Starten von Progammen und der Notwendigkeit, möglichst lange "Röhrensysteme" zu verlegen, geeignet sein; vernünftig arbeiten läßt sich mit anderem jedoch besser.

Gruß,
/dev
Back to top
View user's profile Send private message
Anarcho
Advocate
Advocate


Joined: 06 Jun 2004
Posts: 2970
Location: Germany

PostPosted: Mon Jan 02, 2006 4:29 pm    Post subject: Reply with quote

Deever wrote:
Oje, bitte verzeiht, daß ich an dieser Stelle nicht viel früher eingeschritten bin! Schade um die vielen, unnötigen Tastenanschläge!
Folgendes Kommando löst Pegasus87's Problem:
Code:
$ rm /ver/zeich/nis/*(.Om[1])

Dies setzt natürlich voraus, daß man die Z-Shell benutzt, was aber auch zu empfehlen ist. Die Bash mag zum Starten von Progammen und der Notwendigkeit, möglichst lange "Röhrensysteme" zu verlegen, geeignet sein; vernünftig arbeiten läßt sich mit anderem jedoch besser.

Gruß,
/dev


Wir werden hier doch alle nach Tastenanschlägen bzw. Zeilen bezahlt! :twisted:
_________________
...it's only Rock'n'Roll, but I like it!
Back to top
View user's profile Send private message
smg
Veteran
Veteran


Joined: 13 Aug 2004
Posts: 1402
Location: /home/stephan

PostPosted: Mon Jan 02, 2006 4:41 pm    Post subject: Reply with quote

Deever wrote:
Oje, bitte verzeiht, daß ich an dieser Stelle nicht viel früher eingeschritten bin! Schade um die vielen, unnötigen Tastenanschläge!
Folgendes Kommando löst Pegasus87's Problem:
Code:
$ rm /ver/zeich/nis/*(.Om[1])

Dies setzt natürlich voraus, daß man die Z-Shell benutzt, was aber auch zu empfehlen ist. Die Bash mag zum Starten von Progammen und der Notwendigkeit, möglichst lange "Röhrensysteme" zu verlegen, geeignet sein; vernünftig arbeiten läßt sich mit anderem jedoch besser.

Gruß,
/dev


Unnötig sind sie nicht, wenn der OP nämlich die Bash benutzt.

Bye.
_________________
GnuPG-Key-ID: 0xF8C275D4
Fingerprint: 5B6F 134A 189B A24D 342B 0961 8D4B 0230 F8C2 75D4
Code:
perl -WTe '($")=$/;print qq(@{[reverse('0'..'100')]}$/BOOM!$/);'
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum