Nur Dateien ab Datum X TARen?

Moin,

ist es eigentlich möglich, ein komplettes Verzeichnis rekursiv zu TARen, dabei jedoch nur solche Dateien zu berücksichtigen, die nach einem bestimmten Datum angelegt bzw. geändert wurden?

Eine Alternative wäre vielleicht, wenn man ls dazu überreden könnte, diese Dateien aufzulisten. Dann könnte man sich wenigstens eine Batch-Datei erzeugen.

Oder muss ich da doch erst mit Perl ran?

Danke für Hinweise,
Kristian

Hallo Kristian,

ist es eigentlich möglich, ein komplettes Verzeichnis rekursiv
zu TARen, dabei jedoch nur solche Dateien zu berücksichtigen,
die nach einem bestimmten Datum angelegt bzw. geändert wurden?

Mittels man tar findet man die Option –newer=DATUM. Das sollte bei Deinem Problem helfen. Als Alternative kannst Du die zu tarenden Dateien in ein File schreiben und dieses dann mit –files-from=DATEI einlesen.

Mfg,
Pürsti

Mittels man tar findet man die Option
–newer=DATUM. Das sollte bei Deinem Problem helfen.

Aha, soso. Ich hatte in meinem man geguckt natürlich, aber das „–newer“ fehlt darin (SunOS 5.5.1). Welche Syntax muss denn das Datum da haben? mm/dd/yy? Ausprobieren kann ich es ja immerhin mal. Müsste wohl sowas bei rauskommen, oder?:

tar --newer=05/04/04 -cvf CDS.tar CDS/* && gzip CDS.tar

Als Alternative kannst Du die zu tarenden Dateien in ein File
schreiben und dieses dann mit –files-from=DATEI
einlesen.

Was meinst Du damit? Meines Wissens macht der TAR doch nichts anderes als die Dateien in ein File zu schreiben.

Mittels man tar findet man die Option
–newer=DATUM. Das sollte bei Deinem Problem helfen.

Aha, soso. Ich hatte in meinem man geguckt natürlich, aber das
„–newer“ fehlt darin (SunOS 5.5.1).

Ich arbeite mit GNU tar 1.13.25. Unter Linux. Möglich, dass dies in SunOS 5.5.1 anders aussieht.

Welche Syntax muss denn

das Datum da haben? mm/dd/yy?

Bei mir funktioniert dies mit yyyy-mm-dd. Wie es aber bei dir aussieht, kann ich leider nicht sagen…

Als Alternative kannst Du die zu tarenden Dateien in ein File
schreiben und dieses dann mit –files-from=DATEI
einlesen.

Was meinst Du damit? Meines Wissens macht der TAR doch nichts
anderes als die Dateien in ein File zu schreiben.

Da habe ich mich etwas missverständlich ausgedrückt, sorry. Mit „…die zu tarenden Dateien in ein File schreiben…“ meinte ich, ein File anlegen, in welchem die NAMEN der zu tarenden Dateien stehen. Diese Namensliste kann man dann mittels –files-from= einlesen. Zumindest mit tar 1.13.25.

Eine andere Idee:
Funktioniert bei Dir
tar -czf /temp/test.tar find -mtime -3
Diese Zeile sollte nämlich alle Dateien, welche in den letzten 72(=3*24) Stunden geändert wurden, taren und gzippen.

Mfg,
Pürsti

Bei mir funktioniert dies mit yyyy-mm-dd. Wie es aber bei dir
aussieht, kann ich leider nicht sagen…

Also das mit dem newer scheint gar nicht zu funktionieren. Scha(n)de. :wink:

Als Alternative kannst Du die zu tarenden Dateien in ein File
schreiben und dieses dann mit –files-from=DATEI
einlesen.

Was meinst Du damit? Meines Wissens macht der TAR doch nichts
anderes als die Dateien in ein File zu schreiben.

Da habe ich mich etwas missverständlich ausgedrückt, sorry.
Mit „…die zu tarenden Dateien in ein File schreiben…“
meinte ich, ein File anlegen, in welchem die NAMEN der zu
tarenden Dateien stehen. Diese Namensliste kann man dann
mittels –files-from= einlesen. Zumindest mit tar
1.13.25.

Achso, genau das meinte ich mit dem „ls überreden“. Statt ls also find. Gut, das ginge natürlich auch, und vor allem: Das GEHT auch (wenn ich noch das Verzeichnis angebe dazwischen: find . -mtime -3)!

Eine andere Idee:
Funktioniert bei Dir
tar -czf /temp/test.tar find -mtime -3
Diese Zeile sollte nämlich alle Dateien, welche in den letzten
72(=3*24) Stunden geändert wurden, taren und gzippen.

Nö. Erstens kennt tar den Parameter „z“ offenbar nicht (ich nehme da „v“), und zweitens funktioniert das mit der Pipeline von find zu tar so nicht bei mir. Ich hab´s mal damit probiert:

tar -cvf test.tar **find . -mtime -10

aber auch das ging nicht. Diese Hochkommata kann ich bei mir irgendwie nicht eingeben in der Shell … moment, ich probier´s mal mit ´ner Batch-Datei … vi angeworfen … Mist, da kriege ich die Teile auch nicht rein.

Wie mache ich das nun? Hast Du eine Idee?

Kristian**

Aha, soso. Ich hatte in meinem man geguckt natürlich, aber das
„–newer“ fehlt darin (SunOS 5.5.1). Welche Syntax muss denn
das Datum da haben? mm/dd/yy? Ausprobieren kann ich es ja
immerhin mal.

Nö. Kannst du nicht so ohne weiteres. Auf deiner Sun läuft lupenreines Unix, und die Tools dort sind lupenreine Tools für Unix.

Dein tar auf der Sun kann nur das, was in der man-Page steht, und solch moderner Schnickschnack wie --newer ist gar nicht implementiert. Was du benötigst, die die freie Version von tar, nämlich Gnu-tar. Am besten schaust du dich hier um: http://www.sunfreeware.com/ (dann am besten links einen Mirror wählen, weil die Hauptsite manchmal ziemlich zäh sein kann).

Dort wird dir alles als Sun-Package angeboten (rechts oben Sparc/Solaris 2.5 auswählen). Wenn du kein gzip hast, beginnst du damit. Download und Installation mit

pkgadd -d gzip-1.3.5-sol25-sparc-local

Danach besorgst du dir tar-1.13.19-sol25-sparc-local.gz (oder welche Version auch immer). Dekomprimieren mit

/usr/local/bin/gunzip tar-1.13.19-sol25-sparc-local.gz
pkgadd -d tar-1.13.19-sol25-sparc-local

und rufst dann dieses tar mit /usr/local/bin/tar --newer auf.

Stefan

Nö. Erstens kennt tar den Parameter „z“ offenbar nicht (ich
nehme da „v“),

z geht nur mit gnutar und komprimiert gleichzeitig (aber auch nur, wenn gzip auf dem System installiert ist und sich im Pfad befindet), während v der Schalter für die Bildschirmausgabe ist.

aber auch das ging nicht. Diese Hochkommata kann ich bei mir
irgendwie nicht eingeben in der Shell

Wichtig: es sind keine Hochkommata oder Apostroph-Zeichen, sondern der französiche accent grave (Shift + accent aigue).

Stefan

Nö. Kannst du nicht so ohne weiteres. Auf deiner Sun läuft
lupenreines Unix, und die Tools dort sind lupenreine Tools für Unix.

Richtig. Nur, dass es nicht meine Sun ist :wink:

Was du benötigst, die die freie Version von tar, …

Hm, da gucke ich mal. Arbeite zwar auf´m Company-Server, aber vielleicht lässt sich das ja lokal realisieren.

Danke,
Kristian

Bei mir funktioniert dies mit yyyy-mm-dd. Wie es aber bei dir
aussieht, kann ich leider nicht sagen…

Also das mit dem newer scheint gar nicht zu funktionieren.
Scha(n)de. :wink:

GNU tar ist ziemlich angestaubt und wird eigentlich auch schon lange nicht mehr gewartet. Gluecklicherweise gibt es ein paar Leute, die immer wieder patches fuer das Ding schreiben, um wenigstens ein paar aktuelle features darin zu haben.

[find . -mtime -3]

Eine andere Idee:
Funktioniert bei Dir
tar -czf /temp/test.tar find -mtime -3
Diese Zeile sollte nämlich alle Dateien, welche in den letzten
72(=3*24) Stunden geändert wurden, taren und gzippen.

Nö. Erstens kennt tar den Parameter „z“ offenbar nicht (ich
nehme da „v“),

Die Weiterleitung an gzip (-z) ist auch so ein non-standard-feature. -v und -z sind uebrigens gaenzlich unterschiedliche Dinge.

und zweitens funktioniert das mit der Pipeline
von find zu tar so nicht bei mir.

Das ist keine pipeline.

Ich hab´s mal damit probiert:
tar -cvf test.tar find . -mtime -10

Das ist ja auch Muell: 'find . -mtime -3 |tar -cO --files-from - |bzip2 >foo.tar.bz2 Wenn es bei Dir kein bzip2 gibt kannst du auch gzip nehmen:

find . -mtime -3 |tar -cO --files-from - |gzip \>foo.tar.gz

(aber tar+gzip ist sehr, sehr *pfui*!) oder nur ein tar-Archiv anlegen:

find . -mtime -3 |tar -cO --files-from - \>foo.tar

HTH,
Gruss vom Frank.

GNU tar ist ziemlich angestaubt und wird eigentlich auch schon
lange nicht mehr gewartet. Gluecklicherweise gibt es ein paar
Leute, die immer wieder patches fuer das Ding schreiben, um
wenigstens ein paar aktuelle features darin zu haben.

So muss dat sein.

Die Weiterleitung an gzip (-z) ist auch so ein non-standard feature.

Solange es funktioniert, ist es mir egal :wink:

-v und -z sind uebrigens gaenzlich unterschiedliche Dinge.

Hätte ich mir denken können, aber in Ermangelung jeglicher Kenntnis über „z“ … Ist ja aber egal. „v“ tut, was es soll.

und zweitens funktioniert das mit der Pipeline
von find zu tar so nicht bei mir.

Das ist keine
pipeline.

Wie gut, dass das bei mir nicht interpretiert wird … :wink:
Okay, das ist keine Pipeline. Aber immerhin wusste jeder, was ich meine, denke ich :wink:

Das ist ja auch Muell: 'find . -mtime -3 |tar -cO
–files-from - |bzip2 >foo.tar.bz2 Wenn es bei Dir
kein bzip2 gibt kannst du auch gzip nehmen:

find . -mtime
-3 |tar -cO --files-from - |gzip >foo.tar.gz

(aber
tar+gzip ist sehr, sehr *pfui*!) oder nur ein
tar-Archiv anlegen:

find . -mtime -3 |tar -cO
–files-from - >foo.tar

Achso, stimmt, umgekehrt natürlich. Das probiere ich mal (in der Annahme, dass es sich diesmal um eine Pipeline handelt).
Übrigens: Warum ist gzip pfui, noch dazu sehr pfui? Hier gibt´s übrigens nur die pfui-Variante.

HTH,
Gruss vom Frank.

Ebenso (was auch immer HTH ist).

–files-from unbekannt

Hier kann --files-from auch von stdin lesen. Daher
funktioniert (hier):

find . -mtime -3 |tar -cO
–files-from - |bzip2 >foo.tar.bz2

Wenn es bei Dir
kein bzip2 gibt kannst du auch gzip nehmen:

find . -mtime
-3 |tar -cO --files-from - |gzip >foo.tar.gz

(aber
tar+gzip ist sehr, sehr *pfui*!) oder nur ein
tar-Archiv anlegen:

find . -mtime -3 |tar -cO
–files-from - >foo.tar

Achso, das -files-from funzt hier ja auch nicht, so wie das --newer. Aber ich komme offenbar folgendermassen weiter:

find ./\* -mtime -10 \> tar.inc; tar -cvf test\_inc.tar -I tar.inc; rm tar.inc

Oder kann man das nun wieder in eine Pipeline oder dergleichen stecken, um die Kreation von „tar.inc“ zu verhindern?

Kristian

noch ein Fehler …

Achso, das -files-from funzt hier ja auch nicht, so wie das --newer.
Aber ich komme offenbar folgendermassen weiter:
find ./* -mtime -10 > tar.inc; tar -cvf test_inc.tar -I tar.inc; rm tar.inc
Oder kann man das nun wieder in eine Pipeline oder dergleichen
stecken, um die Kreation von „tar.inc“ zu verhindern?

Hm, da gibt es leider einen Haken: Das find liefert nicht nur Files, sondern auch Verzeichnisse zurück, und die werden dann natürlich vom tar komplett getart - inklusive aller Files, die das mtime-Kriterium gar nicht erfüllen.

Kann man entweder beim find die Ausgabe oder beim tar die Verarbeitung von Verzeichnissen unterbinden? Habe in den man´s auf die Schnelle nichts finden können.

Danke.

Okay, das ist keine Pipeline. Aber immerhin wusste jeder, was
ich meine, denke ich :wink:

Fuer spaeter: shell expansion waere richtig gewesen.

Übrigens: Warum ist gzip pfui, noch dazu sehr pfui? Hier
gibt´s übrigens nur die pfui-Variante.

Ich schrieb ‚sehr, sehr pfui‘. Weil es reicht, dass ein Bit in dem Archiv umkippt, um 20GB backup in /dev/null zu versenken. Wenn es nur gzip gibt, dann packe erst und fuege die Dateien mit tar zusammen (nicht ganz so effektiv, aber sicherer).

Ebenso (was auch immer HTH ist).

Hope this helps,
Gruss vom Frank.

Achso, das -files-from funzt hier ja auch nicht, so wie das
–newer. Aber ich komme offenbar folgendermassen
weiter:
find ./* -mtime -10 > tar.inc; tar -cvf test_inc.tar -I tar.inc; rm tar.inc

Und hier gibt es -I nicht… Unabhaengig davon solltest Du ein Konstrukt wie

find . -mtime -10 \> tar.inc && tar -cvf test\_inc.tar -I tar.inc && rm tar.inc

verwenden. Das && macht das Ausfuehren des folgenden Befehls vom Erfolg des vorangegangenen abhaengig. ‚./*‘ ist auch doof, da es von der shell expandiert wird. Nicht machen, es sei denn, Du machst das absichtlich.

Oder kann man das nun wieder in eine Pipeline oder dergleichen
stecken, um die Kreation von „tar.inc“ zu verhindern?

Kann -I vielleicht auch durch Ersetzen von ‚tar.inc‘ durch ein ‚-‘ zum Lesen von stdin ueberredet werden? Dann wuerde

find . -mtime -10 |tar -cvf test\_inc.tar -I -

funktionieren.

Fuer die dritte Frage (in dem anderen Artikel) willst Du die Dokumentation (man page) von find nach -type durchsuchen.

HTH,
Gruss vom Frank.

Kann man entweder beim find die Ausgabe oder beim
tar die Verarbeitung von Verzeichnissen unterbinden?
Habe in den man´s auf die Schnelle nichts finden können.

„-type f“ im find könnte helfen

Leider keine Ahnung, ob das Solaris find das kann, kenne nur die GNU Version.

Alexander

„-type f“ im find könnte helfen

Genau das ist es. Hatte das „f“ es im Wust übersehen. Danke!

Das && macht das Ausfuehren des folgenden Befehls vom Erfolg des vorangegangenen abhaengig.

Achso, ja … die Erinnerung kommt langsam wieder … :wink:

‚./*‘ ist auch doof, da es von der shell expandiert wird.
Nicht machen, es sei denn, Du machst das absichtlich.

Nunja, hier war es Absicht, die allerdings mit „type -f“ hinfällig wird.

Kann -I vielleicht auch durch Ersetzen von ‚tar.inc‘ durch ein
‚-‘ zum Lesen von stdin ueberredet werden? Dann wuerde

find . -mtime -10 |tar -cvf test_inc.tar -I -

funktionieren.

Nein, das macht er nicht. Naja, dann eben doch über´s File.

Fuer die dritte Frage (in dem anderen Artikel) willst Du die
Dokumentation (man page) von find nach -type durchsuchen.

-f …

HTH,

ID (it does)