Kann tar von stdin lesen?
Hallo zusammen
Ich versuche gerade, einige duzend tar-Archive zu entpacken, welche alle
inner- oder unterhalb eines Verzeichnis liegen. Habe mir dazu folgende
Befehlszeile gebastelt:
find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/:
*[POSIX]* tar archive//' | sed 's/.\///'
Das gibt mir eine Liste aller tar-Archive im Verzeichnis aus. Den Aufruf
von 'file' brauche ich, da im Verzeichnis mit den Archiven noch andere
Dateien liegen.
Nun müsste ich das irgendwie an tar weitergeben:
tar -xvf
Hallo Marco Schuler schrieb:
Hallo zusammen
Ich versuche gerade, einige duzend tar-Archive zu entpacken, welche alle inner- oder unterhalb eines Verzeichnis liegen. Habe mir dazu folgende Befehlszeile gebastelt:
find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///'
Das gibt mir eine Liste aller tar-Archive im Verzeichnis aus. Den Aufruf von 'file' brauche ich, da im Verzeichnis mit den Archiven noch andere Dateien liegen.
Nun müsste ich das irgendwie an tar weitergeben:
tar -xvf
-C <zielverzeichnis>
cat <dateiname> | tar -xzf - -C <verzeichnis>
Der einzelne Bindestrich ist wichtig, er sagt tar, dass es von der
Standardeingabe lesen soll
ergo wahrscheinlich etwas in der Art von:
cat $(find . -type f -print0 | xargs -0 file {} | grep tar | sed
's/:*[POSIX]* tar archive//' | sed 's/.\///') | tar -xzf - -C
mit pipen, xargs und `
`hab ich es schon versucht. Leider ohne Erfolg :-( Wie kann ich das machen?
Danke für eure Tips!
gruss, robert
Am Do, 2004-03-11 um 10.43 schrieb Robert Paix:
Marco Schuler schrieb:
cat <dateiname> | tar -xzf - -C <verzeichnis>
Der einzelne Bindestrich ist wichtig, er sagt tar, dass es von der Standardeingabe lesen soll
Und woher kriegt man diese Information? In man tar habe ich sowas jedenfalls nicht gefunden... -- Grüsse Marco
Marco Schuler schrieb:
Am Do, 2004-03-11 um 10.43 schrieb Robert Paix:
Marco Schuler schrieb:
cat <dateiname> | tar -xzf - -C <verzeichnis>
Der einzelne Bindestrich ist wichtig, er sagt tar, dass es von der Standardeingabe lesen soll
Und woher kriegt man diese Information? In man tar habe ich sowas jedenfalls nicht gefunden...
Nun, die bekommt man, wenn man am Anfang seiner Admin-Zeit eine Zeile wie folgt sieht: tar -cvf - /Source | rsh ZIELRECHNER " cd / ; tar -xvf - " und dann fragt, was denn der Bindestrich bedeutet. gruss, robert
Am Do, 2004-03-11 um 11.26 schrieb Robert Paix:
Marco Schuler schrieb:
Am Do, 2004-03-11 um 10.43 schrieb Robert Paix:
Marco Schuler schrieb:
cat <dateiname> | tar -xzf - -C <verzeichnis>
Der einzelne Bindestrich ist wichtig, er sagt tar, dass es von der Standardeingabe lesen soll
Und woher kriegt man diese Information? In man tar habe ich sowas jedenfalls nicht gefunden...
Nun, die bekommt man, wenn man am Anfang seiner Admin-Zeit eine Zeile wie folgt sieht: tar -cvf - /Source | rsh ZIELRECHNER " cd / ; tar -xvf - "
und dann fragt, was denn der Bindestrich bedeutet.
Ok, Erfahrung macht eben auch den Meister. Leider funktioniert meine Befehlszeile aber immer noch nicht: find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///' | tar -xvf - -C <verzeichnis> tar: Das sieht nicht wie ein »tar«-Archiv aus. tar: Springe zum nächsten Kopfteil. tar: Fehler beim Beenden, verursacht durch vorhergehende Fehler. Hab mal probehalber versucht, die erste Datei, die obige Befehlszeile ohne tar ausspuckt, manuell zu entpacken (tar -xvf <archiv> -C <verzeichnis>. Das hat geklappt. Wo liegt mein Fehler? -- Grüsse Marco
Hallo! Am Donnerstag, 11. März 2004 11:38 schrieb Marco Schuler:
Leider funktioniert meine Befehlszeile aber immer noch nicht:
find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///' | tar -xvf - -C <verzeichnis> tar: Das sieht nicht wie ein »tar«-Archiv aus. tar: Springe zum nächsten Kopfteil. tar: Fehler beim Beenden, verursacht durch vorhergehende Fehler.
Bei mir funktioiert die Zeile auch nicht. Ich habe aber auch schon ein paar Ideen: 1) grep tar Bei mir blieben da ein paar Dateien zuviel hängen, die die Zeichenkette "tar" im Namen hatten. Besser: grep "tar archive" Da bleiben weniger Dateien im Netz hängen, und die scheinen auch alle tar-Archive zu sein. 2) sed s/:*[POSIX]* tar archive//' Resultat bei mir: x.tar: GNU villastraylight/k-u.tar: GNU Dummerweise unterscheiden sich die Magics von tar und GNU tar, und damit auch die Meldungen von file. Mein Vorschlag: schneide die Zeile mit einem cut auseinander. Allerdings: die Dateinamen dürfen keinen ":" enthalten (tun z.B. CAD-Dateien manchmal). cut -d ":" -f 1 Dann kommen bei mir als Resultat: x.tar villastraylight/k-u.tar Viel Spaß Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
Hallo, Am Fri, 12 Mar 2004, Thilo Gramlich schrieb:
Hallo!
Am Donnerstag, 11. März 2004 11:38 schrieb Marco Schuler:
Leider funktioniert meine Befehlszeile aber immer noch nicht:
find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///' | tar -xvf - -C
*urgsl* useless use of grep, useless use of sed. Eine Kette wie grep foo | sed '...' ist _immer_ ueberfluessig und durch: sed '/foo/{ ...; }' ersetzbar. Ebenso ist sed 'aaa' | sed 'bbb' immer durch ein einzelnes sed ersetzbar, und sei's mittels sed -e 'aaa' -e 'bbb', meist geht aber sed -e 'aaa;bbb;'. find . -type f -print0 \ | xargs -0 file \ | sed -n '/tar archive/s/^\([^:]\+\): .*/\1/p' \ | while read f; do \ test -r "$f" && tar -C <zieldir> -xvf "$f"; \ done Obiges klappt mit fast allen Dateinamen (mit Zeilenumbruechen klappt's nicht). -dnh -- If you haven't got time to RTFM, you haven't got time to whine on this mailing list.
Hallo, Am Fr, 2004-03-12 um 03.53 schrieb David Haller: [...]
*urgsl*
useless use of grep, useless use of sed.
Eine Kette wie grep foo | sed '...' ist _immer_ ueberfluessig und durch:
sed '/foo/{ ...; }'
ersetzbar.
Als leider zu lange Jahre Window$-GUI Geschädigter beginne ich erst, die wunderbaren Eigenschaften und die Macht der Shell und ihrer Tools zu nutzen. Da gelingt halt noch nicht auf Anhieb alles perfekt. Trotzdem danke für den Tip!
Ebenso ist sed 'aaa' | sed 'bbb' immer durch ein einzelnes sed ersetzbar, und sei's mittels sed -e 'aaa' -e 'bbb', meist geht aber sed -e 'aaa;bbb;'.
find . -type f -print0 \ | xargs -0 file \ | sed -n '/tar archive/s/^\([^:]\+\): .*/\1/p' \ | while read f; do \ test -r "$f" && tar -C <zieldir> -xvf "$f"; \ done
Obiges klappt mit fast allen Dateinamen (mit Zeilenumbruechen klappt's nicht).
Ok, ich werde mal über "sed -n '/tar archive/s/^\([^:]\+\): .*/\1/p'" brüten und versuchen zu verstehen... -- Grüsse Marco
Hallo! @David Am Freitag, 12. März 2004 03:53 schrieb David Haller:
Hallo, Eine Kette wie grep foo | sed '...' ist _immer_ ueberfluessig und durch:
sed '/foo/{ ...; }'
ersetzbar. Ebenso ist sed 'aaa' | sed 'bbb' immer durch ein einzelnes sed ersetzbar, und sei's mittels sed -e 'aaa' -e 'bbb', meist geht aber sed -e 'aaa;bbb;'.
sed ist nicht gerade meine Stärke, meist weiche dann auf awk aus. Danke für die Ausführungen. Thilo -- ------------------------------------------------------------------------------------ Thilo Gramlich Thilo (a dot) Gramlich (an at symbol) aktivanet (a dot) de
Hallo Am Fr, 2004-03-12 um 01.53 schrieb Thilo Gramlich:
1) grep tar Bei mir blieben da ein paar Dateien zuviel hängen, die die Zeichenkette "tar" im Namen hatten. Besser:
grep "tar archive"
Da bleiben weniger Dateien im Netz hängen, und die scheinen auch alle tar-Archive zu sein.
Das stimmt natürlich. Die Befehlszeile war nicht als Universal-Tool gedacht. Nur problemorientiert auf meine Dateien, welche kein tar im Namen enthalten.
2) sed s/:*[POSIX]* tar archive//' Resultat bei mir:
x.tar: GNU villastraylight/k-u.tar: GNU
Dummerweise unterscheiden sich die Magics von tar und GNU tar, und damit auch die Meldungen von file.
_Das_ wusste ich nicht!
Mein Vorschlag: schneide die Zeile mit einem cut auseinander. Allerdings: die Dateinamen dürfen keinen ":" enthalten (tun z.B. CAD-Dateien manchmal). cut -d ":" -f 1
Dann kommen bei mir als Resultat:
x.tar villastraylight/k-u.tar
Danke für die Tips! Die werden mir, auch jetzt da mein ursprüngliches Problem gelöst ist, sicher in Zukunft hilfreich sein. -- Grüsse Marco
*** Marco Schuler (listworks@gmx.ch) schrieb heute in suse-linux:
[...] Und woher kriegt man diese Information? In man tar habe ich sowas jedenfalls nicht gefunden...
Garnicht. Die Antwort passte nicht zu Deiner Problemstellung. MfG Henning Hucke -- Stellt euch vor, deutsche wuerden alle Arbeitsplaetze annehmen, die deutsche Unternehmen in Ausland aufbauen, nachdem sie in Deutschland abgebaut worden sind... Ein Land ohne Volk. (c) Hucke
*** Robert Paix (lu-rpx@encad.de) schrieb heute in suse-linux:
[...] cat <dateiname> | tar -xzf - -C <verzeichnis>
Der einzelne Bindestrich ist wichtig, er sagt tar, dass es von der Standardeingabe lesen soll
Du hast die Problembeschreibung nicht aufmerksam gelesen! Es werden die *Namen der Archive* übergeben, nicht die Namen der Files, die aus einem Archiv entpackt werden sollen. Bitte keine Fullquotes, auch wenn es kein TUFO oder TOFU war!
[...]
MG Henning Hucke -- "Kooperation und Ruecksichtnahme ist Schwaeche", sagte der Topmanager, "Macher" und Erfolgsmensch, als er die letzten frei lebenden Paradies- voegel im Zuge der Rodungsarbeiten fuer seine neue Billiglohnfabrik in der dritten Welt toeten lies. (c) H.Hucke
Henning Hucke schrieb:
Du hast die Problembeschreibung nicht aufmerksam gelesen! Es werden die *Namen der Archive* übergeben, nicht die Namen der Files, die aus einem Archiv entpackt werden sollen.
Hab ich nicht ? Ach so ... _Kurzes_ Zitat aus der Anfangsmail:
Nun müsste ich das irgendwie an tar weitergeben:<
Les bitte das nächste Mal einfach vorher den gesamten Beitrag. gruss, Robert
*** Robert Paix (lu-rpx@encad.de) schrieb heute in suse-linux:
Henning Hucke schrieb:
Du hast die Problembeschreibung nicht aufmerksam gelesen! Es werden die *Namen der Archive* übergeben, nicht die Namen der Files, die aus einem Archiv entpackt werden sollen.
Hab ich nicht ? Ach so ...
_Kurzes_ Zitat aus der Anfangsmail:
Nun müsste ich das irgendwie an tar weitergeben:<
Les bitte das nächste Mal einfach vorher den gesamten Beitrag.
Ok. Nochmal zum Mitschreiben: Du fährst ein "cat" mit einem Dateinamen. Der Inhalt der Datei wird auf stdout ausgegeben. Das "tar" liest bei der von Dir angegebenen Kommando- zeile sein *Archiv* von stdin und packt es aus (Das entpacken von konkatenierten tar-Archiven funktioniert nicht!). Das ist nicht das Ziel! Marco fragte danach, eine generierte Liste von *Dateinamen von Archiven* dazu zu verwenden, um diese mit "tar" auszupacken. G Henning Hucke --
Man sollte die Sprueche der MCSEs sammeln und als Witzbuch herausgeben. Das waere sicherlich ein Bestseller, meinst du nicht? Gibt's ein Beißholz gratis dazu? Nein, aber ein Schild mit der Aufschrift: "Die meinen das ernst" -- J. Ilse, MOW und Regina
Am Do, 2004-03-11 um 15.15 schrieb Henning Hucke:
*** Robert Paix (lu-rpx@encad.de) schrieb heute in suse-linux:
Henning Hucke schrieb:
Du fährst ein "cat" mit einem Dateinamen. Der Inhalt der Datei wird auf stdout ausgegeben. Das "tar" liest bei der von Dir angegebenen Kommando- zeile sein *Archiv* von stdin und packt es aus (Das entpacken von konkatenierten tar-Archiven funktioniert nicht!).
Will also heissen, tar markiert kein EOA (End of Archive), sonst würde
es wohl mit cat
Das ist nicht das Ziel!
Marco fragte danach, eine generierte Liste von *Dateinamen von Archiven* dazu zu verwenden, um diese mit "tar" auszupacken.
Exakt! -- Grüsse Marco
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo Marko Am Donnerstag, 11. März 2004 10:11 schrieb Marco Schuler:
Hallo zusammen
Ich versuche gerade, einige duzend tar-Archive zu entpacken, welche alle inner- oder unterhalb eines Verzeichnis liegen. Habe mir dazu folgende Befehlszeile gebastelt:
find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///'
Das gibt mir eine Liste aller tar-Archive im Verzeichnis aus. Den Aufruf von 'file' brauche ich, da im Verzeichnis mit den Archiven noch andere Dateien liegen.
Nun müsste ich das irgendwie an tar weitergeben:
tar -xvf
-C <zielverzeichnis> mit pipen, xargs und `
`hab ich es schon versucht. Leider ohne Erfolg :-(
Ich würds lieber so versuchen: for i in ./*.tar,gz; do tar -xzvf $i done Das entpackt Dir ohne Umwege alle Tarballs mit Endung *.tar.gz CU Thorsten - -- Thorsten Körner |e-Commerce-Consulting |e-Commerce-Software Dannenkoppel 51 |http://www.123tk.com |Marketing-Software D-22391 Hamburg |Spezial-Hosting |Usability-Proof t.koerner@123tk.com|CMS / Redaktionssysteme|Individuelle Beratung -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.2-rc1-SuSE (GNU/Linux) iD8DBQFAUDm+s5R35vLkl/cRAkldAJ0W7/1Xe/TETnzCAgqTGgb3JaKimQCeJ0bm EjLn0GPHuRIHrCpOI4kDqQQ= =XyyP -----END PGP SIGNATURE-----
Am Do, 2004-03-11 um 11.04 schrieb Thorsten Körner:
Am Donnerstag, 11. März 2004 10:11 schrieb Marco Schuler:
[...]
Ich würds lieber so versuchen: for i in ./*.tar,gz; do tar -xzvf $i done
Das entpackt Dir ohne Umwege alle Tarballs mit Endung *.tar.gz
Ja, das wäre eine sehr schöne Variante, die ich normalerweise auch benutze. Leider fehlt den Dateien aber diese Endung. Der Mensch, der die Archive gepackt hat, hält nicht viel von Endungen :-( -- Grüsse Marco
*** Marco Schuler (listworks@gmx.ch) schrieb heute in suse-linux:
[...] find . -type f -print0 | xargs -0 file {} | grep tar | sed 's/: *[POSIX]* tar archive//' | sed 's/.\///' [...] Nun müsste ich das irgendwie an tar weitergeben:
tar -xvf
-C <zielverzeichnis> mit pipen, xargs und `
`hab ich es schon versucht. Leider ohne Erfolg :-(
Hmmmm!? ... | xargs -i tar ztvvCf <Zielverzeichnis> \{\} hat bei mir funktioniert. MfG Henning Hucke -- Du möchtest, dass die Mailingliste als Reply-To eingetragen wird? Lies vorher bitte "http://www.helms.sh/replyto/reply-to-harmful-de.html". Danke.
participants (7)
-
David Haller
-
Henning Hucke
-
Marco Schuler
-
Peter Wiersig
-
Robert Paix
-
Thilo Gramlich
-
Thorsten Körner