aus tar-Archiv die neusten 50 Dateien anzeigen
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?" Mit tar zflv archiv.tgz erhält man z.B. diese Ausagabe: [...] -rwxrwxr-x empf/users 70132 2004-09-02 10:56:26 home/cd_brennen/burn_data/home/david/isinfo -rwxrwxr-x empf/users 13356 2002-09-20 15:28:00 home/cd_brennen/burn_data/home/david/isnull -rwxrwxr-x empf/users 164 1998-05-26 00:00:00 home/cd_brennen/burn_data/home/david/iso2ibm -rwxrwxr-x empf/users 3307 2000-09-14 00:00:00 home/cd_brennen/burn_data/home/david/iso7ibm -rwxrwxr-x empf/users 80971 2004-09-02 10:56:26 home/cd_brennen/burn_data/home/david/isppg [...] Jetzt müßte *nur* noch der Aktualität nach sortiert werden >0 danke schon mal Ekkard
Hallo, Am Wed, 24 Nov 2004, Ekkard Gerlach schrieb:
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?"
Mit tar zflv archiv.tgz erhält man z.B. diese Ausagabe:
Du kennst die Nachteile von tar.gz?
Jetzt müßte *nur* noch der Aktualität nach sortiert werden >0
$ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne ' { local @_ = split(/\s+/); print parsedate("$_[3] $_[4]"), " $_"; }' | sort -n | tail -n 50 oder ganz in perl und nen Tick schneller (aber tar+gzip bremst wohl eh mehr) $ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne ' { @_=split(/\s+/); push(@files, [ (parsedate("$_[3] $_[4]"))[0], $_ ]); } END { print map { $_->[1] } sort { $a->[0] <=> $b->[0] } @files; }' | tail -n 50 oder als script: ==== tar_tv_out_datesort.pl ==== #!/usr/bin/perl -w use strict; use Time::ParseDate; my @files; while(<>) { local @_ = split(/\s+/); push(@files, [ (parsedate("$_[3] $_[4]"))[0], $_ ]); } print map { $_->[1] } sort { $a->[0] <=> $b->[0] } @files; ==== $ tar tzvf archive.tgz | tar_tv_out_datesort.pl | tail -n 50 Oder gleich so: ==== tar_tv_datesort.pl === #!/usr/bin/perl -w use strict; use POSIX qw(strftime); use Stat::lsMode qw(format_mode); use Archive::Tar; my @tarfields = qw( name size mtime mode uid gid linkname uname gname devmajor devminor prefix); foreach(@ARGV) { open(TAR, "<$_") or die "cannot open '$_': $!"; binmode(TAR); my $tar = new Archive::Tar(\*TAR) or die $!; close(TAR) or die $!; foreach( sort { $a->{mtime} <=> $b->{mtime} } $tar->list_files(\@tarfields) ) { printf("%s %s/%s %10i %s %s\n", scalar format_mode($_->{mode}), $_->{uname}, $_->{gname}, $_->{size}, strftime("%Y-%m-%d %H:%M", localtime($_->{mtime})), $_->{name} ); } } ==== $ tar_tv_datesort.pl archive.tgz | tail -n 50 Fuer das letzte script muss du evtl. Stat:lsMode nachinstallieren[1], dafuer laesst sich die Ausgabe leichter anpassen. Z.B. koennte man die auszugebenden Felder anpassen, die Zeitangabe praezisieren usw. Auch das "tail" koennte man noch einbauen, in dem man vom Ergebnis des sort per slice nur die letzten 50 Elemente ausgeben laesst. Da sollte man dann aber die Anzahl dann per Option definieren koennen, wozu man das script doch noch ein bisserl mehr erweitern muesste. HTH, -dnh [1] z.B. mittels 'cpan -i Stat::lsMode' als root, evtl. hat SUSE aber auch ein 'perl-stat-lsmode' o.ae. RPM dabei. 'pin Stat/lsMode.pm' sollte helfen. -- 108: Doppelte Staatsbürgerschaft Was nützt der zweite Ausweis, wenn doch eh der gleiche Name drin steht? (E. Herbst nach Harald Schmidt)
Am Mittwoch, 24. November 2004 01:47 schrieb Ekkard Gerlach:
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?"
Mit tar zflv archiv.tgz erhält man z.B. diese Ausagabe:
Man kann tar auch veranlassen, den Inhalt des Archivs mit dem Inhalt der gesicherten Quelle zu vergleichen (--compare). Das geschieht natürlich, nach dem man die Sicherung erstellt hat. Damit kann man prüfen, ob die Sicherung funktioniert und das Sicherungsmedium keine Fehler hat. Daß die neuesten Dateien drauf sind kann man doch anhand der Kommandozeile feststellen. Die muß halt richtig sein. Ich bin mir ziemlich sicher, daß tar keine Dateien "vergisst", dazu ist tar schon zu lange bei zu vielen Leuten im Einsatz. So ein Fehler wäre dann schon längst aufgetreten. Bye Jürgen -- Dr.rer.nat. Juergen Vollmer, Viktoriastrasse 15, D-76133 Karlsruhe Tel: +49(721) 9204871 Fax: +49(721) 24874 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de Internet-Telefonie: www.skype.com Benutzer: juergen.vollmer
* David Haller schrieb:
Hallo,
Am Wed, 24 Nov 2004, Ekkard Gerlach schrieb:
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?"
Mit tar zflv archiv.tgz erhält man z.B. diese Ausagabe:
Du kennst die Nachteile von tar.gz?
ein Bit kaputt - alles kaputt, richtig? - Dafür wird jede Datensicherung nach Anfertigung auch getestet, nämlich so, daß die 2 wichtigsten Dateien gelistet und auf ein KOntrollblatt notiert werden. Sonst wäre *.tar ohne gzip besser, das meinst Du, richtig?
Jetzt müßte *nur* noch der Aktualität nach sortiert werden >0
$ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne '
[... uff! - ein echter "Haller"] Danke für den "Rest", ich mache mich gleich mal dran ... Ekkard
Hallo, Am Wed, 24 Nov 2004, Ekkard Gerlach schrieb:
* David Haller schrieb: [..]
Du kennst die Nachteile von tar.gz?
ein Bit kaputt - alles kaputt, richtig? - Dafür wird jede Datensicherung nach Anfertigung auch getestet, nämlich so, daß die 2 wichtigsten Dateien gelistet und auf ein KOntrollblatt notiert werden. Sonst wäre *.tar ohne gzip besser, das meinst Du, richtig?
Jep. Oder afio, das komprimiert dateiweise. Siehe die FAQ.
Jetzt müßte *nur* noch der Aktualität nach sortiert werden >0
$ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne ' [... uff! - ein echter "Haller"]
*g* -dnh -- 52: Mindestanforderung: 4 MB Hauptspeicher Mindestanforderung: 8 MB Hauptspeicher (Kristian Köhntopp)
Am Mittwoch, 24. November 2004 06:34 schrieb David Haller:
Am Wed, 24 Nov 2004, Ekkard Gerlach schrieb:
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?"
Mit tar zflv archiv.tgz erhält man z.B. diese Ausagabe: [...] Jetzt müßte *nur* noch der Aktualität nach sortiert werden >0
$ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne ' { local @_ = split(/\s+/); print parsedate("$_[3] $_[4]"), " $_"; }' | sort -n | tail -n 50
oder ganz in perl und nen Tick schneller (aber tar+gzip bremst wohl eh mehr) [...]
*chm chm* Warum einfach, wenns auch kompliziert geht? ;-) tar tvzf archiv.tgz | sort -k 4,5 | tail -n 50 Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
Hallo, Am Wed, 24 Nov 2004, Jan Trippler schrieb:
Am Mittwoch, 24. November 2004 06:34 schrieb David Haller:
Am Wed, 24 Nov 2004, Ekkard Gerlach schrieb:
Hat hier jmd schon eine Lösung aus einem tar/ tgz-Archiv die neusten 50-Dateien anzeigen zu lassen? - Es geht um die Prüfung einer Datensicherung: "Sind auch die neusten, neuen Dateien von heute 'drauf?" [..] $ tar tvzf archiv.tgz | perl -MTime::ParseDate -ne ' { local @_ = split(/\s+/); print parsedate("$_[3] $_[4]"), " $_"; }' | sort -n | tail -n 50
oder ganz in perl und nen Tick schneller (aber tar+gzip bremst wohl eh mehr) [...]
*chm chm* Warum einfach, wenns auch kompliziert geht? ;-)
tar tvzf archiv.tgz | sort -k 4,5 | tail -n 50
Das ist natuerlich klar besser :) Ich hab irgendwie nicht gesehen, dass das Datum in einer per sort sortierbaren Form ausgegeben wird. Kennst du ein Tool, das wie Time::ParseDate, Date::Parse oder Date::Manip ein Datum parsen koennen? Ich habe also an den allgemeinen Fall gedacht ;) Z.B. eine Liste wie von 'ls -l --full-time' willst du nicht mit sort sortieren ;) Das geht dann aber mit Time::ParseDate (usw.) nach dem gleichen Schema, analog wenn man mit perl sortiert. ls -l --full-time | perl -MTime::ParseDate -ne '{ local @_ = split(/\s+/); print parsedate(join(" ", @_[5,6,7,8])), " $_\n"; }' Ja, klar kann ls --sort=time das selbst, aber nimm z.B. ne Dateiliste von irgendnem FTP-Server o.ae. und die Felder im slice kann man ja leicht an die Liste anpassen. Man kann also meine Loesungen als Vorbild fuer Faelle nehmen, wo die Ausgabe nicht per sort -k .. sortierbar ist und man die Liste auch nicht direkt sortiert ausgeben lassen kann. -dnh -- 6.9 is a good thing interupted by a period.
Am Mittwoch, 24. November 2004 22:44 schrieb David Haller: [...]
Kennst du ein Tool, das wie Time::ParseDate, Date::Parse oder Date::Manip ein Datum parsen koennen? Ich habe also an den allgemeinen Fall gedacht ;) Z.B. eine Liste wie von 'ls -l --full-time' willst du nicht mit sort sortieren ;) Das geht dann aber mit Time::ParseDate (usw.) nach dem gleichen Schema, analog wenn man mit perl sortiert.
Ich kenne nichts Fertiges - aber wenn ich in die Verlegenheit kommen würde, einen generischen Ansatz dafür schreiben zu müssen, dann würde ich es eher so machen, dass ich das erwartete Format der Zeitangabe dem Programm mitgebe (Option -f "<format>" mit einer Syntax ähnlich wie date wäre ganz hübsch - alternativ kann man auch gleich die Perl-RegEx mitgeben ;-) und das zum Parsen benutzen würde. Das hält das Programm schlank und ohne Kenntnis des zu verarbeitenden Formats bist Du eh erschossen. Die eierlegende Wollmilchsau wäre ein Parser, der anhand von typischen Mustern einen Zeitstempel erkennt und diesen analysiert - nur wozu? Geek-Spielerei IMHO ohne besonderen Nutzen. Jan -- Linux-Quickies: http://www.jan-trippler.de PingoS: http://www.pingos.org
participants (4)
-
David Haller
-
Dr. Jürgen Vollmer
-
Ekkard Gerlach
-
Jan.Trippler@t-online.de