View previous topic :: View next topic |
Author |
Message |
Pegasus87 Guru
![Guru Guru](/images/ranks/rank_rect_3.gif)
Joined: 09 Sep 2004 Posts: 373
|
Posted: Sun Jan 01, 2006 10:13 pm Post subject: [SHELL-SCRIPT] Die älteste Datei löschen |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
SinoTech Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
Joined: 20 Mar 2004 Posts: 2579 Location: Neunkirchen / Saarland / Germany
|
Posted: Sun Jan 01, 2006 10:20 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
STiGMaTa_ch Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/247250489451487b8a41ec.gif)
Joined: 28 Dec 2004 Posts: 1686 Location: Rüti ZH / Schweiz
|
Posted: Sun Jan 01, 2006 10:25 pm Post subject: |
|
|
Code: | for a in `ls -1t`;do AeltesteDatei=$a;done
rm $AeltesteDatei |
#Edit
SinoTech war schneller...
Lieber Gruss
STiGMaTa |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Pegasus87 Guru
![Guru Guru](/images/ranks/rank_rect_3.gif)
Joined: 09 Sep 2004 Posts: 373
|
Posted: Sun Jan 01, 2006 10:28 pm Post subject: |
|
|
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 ![Very Happy :D](images/smiles/icon_biggrin.gif) |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
smg Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/1227089703419756a3aa42e.png)
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Sun Jan 01, 2006 10:33 pm Post subject: |
|
|
$ 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 |
|
![](templates/gentoo/images/spacer.gif) |
SinoTech Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
Joined: 20 Mar 2004 Posts: 2579 Location: Neunkirchen / Saarland / Germany
|
Posted: Sun Jan 01, 2006 11:19 pm Post subject: |
|
|
Nice, "-A" habe ich noch nicht gekannt .. naja, man kann schließlich auch nicht jeden switch kennen .
Mfg
Sino |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
Pegasus87 Guru
![Guru Guru](/images/ranks/rank_rect_3.gif)
Joined: 09 Sep 2004 Posts: 373
|
Posted: Mon Jan 02, 2006 11:46 am Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
smg Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/1227089703419756a3aa42e.png)
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Mon Jan 02, 2006 11:54 am Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Pegasus87 Guru
![Guru Guru](/images/ranks/rank_rect_3.gif)
Joined: 09 Sep 2004 Posts: 373
|
Posted: Mon Jan 02, 2006 12:00 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
monade Apprentice
![Apprentice Apprentice](/images/ranks/rank_rect_2.gif)
![](images/avatars/28845933443d02e7e43805.gif)
Joined: 17 Mar 2005 Posts: 204 Location: Berlin
|
Posted: Mon Jan 02, 2006 1:12 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
smg Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/1227089703419756a3aa42e.png)
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Mon Jan 02, 2006 1:36 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Pegasus87 Guru
![Guru Guru](/images/ranks/rank_rect_3.gif)
Joined: 09 Sep 2004 Posts: 373
|
Posted: Mon Jan 02, 2006 1:49 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Anarcho Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/1030393113423afb9086043.jpg)
Joined: 06 Jun 2004 Posts: 2970 Location: Germany
|
Posted: Mon Jan 02, 2006 2:22 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Earthwings Bodhisattva
![Bodhisattva Bodhisattva](/images/ranks/rank-bodhisattva.gif)
![](images/avatars/49753421747790001d409d.png)
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
Posted: Mon Jan 02, 2006 2:55 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Anarcho Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/1030393113423afb9086043.jpg)
Joined: 06 Jun 2004 Posts: 2970 Location: Germany
|
Posted: Mon Jan 02, 2006 3:11 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Earthwings Bodhisattva
![Bodhisattva Bodhisattva](/images/ranks/rank-bodhisattva.gif)
![](images/avatars/49753421747790001d409d.png)
Joined: 14 Apr 2003 Posts: 7753 Location: Germany
|
Posted: Mon Jan 02, 2006 3:19 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Anarcho Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/1030393113423afb9086043.jpg)
Joined: 06 Jun 2004 Posts: 2970 Location: Germany
|
Posted: Mon Jan 02, 2006 3:53 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
smg Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/1227089703419756a3aa42e.png)
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Mon Jan 02, 2006 3:57 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Deever Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/d9a2e9133d29eda9e7305.gif)
Joined: 06 Jul 2002 Posts: 1354 Location: Zürich / Switzerland
|
Posted: Mon Jan 02, 2006 4:18 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
Anarcho Advocate
![Advocate Advocate](/images/ranks/rank-G-1-advocate.gif)
![](images/avatars/1030393113423afb9086043.jpg)
Joined: 06 Jun 2004 Posts: 2970 Location: Germany
|
Posted: Mon Jan 02, 2006 4:29 pm Post subject: |
|
|
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 Evil :twisted:](images/smiles/icon_twisted.gif) _________________ ...it's only Rock'n'Roll, but I like it! |
|
Back to top |
|
![](templates/gentoo/images/spacer.gif) |
smg Veteran
![Veteran Veteran](/images/ranks/rank_rect_5_vet.gif)
![](images/avatars/1227089703419756a3aa42e.png)
Joined: 13 Aug 2004 Posts: 1402 Location: /home/stephan
|
Posted: Mon Jan 02, 2006 4:41 pm Post subject: |
|
|
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 |
|
![](templates/gentoo/images/spacer.gif) |
|