tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
1532
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von DasArne
    DasArne DasArne ist offline Mitglied
    Registriert seit
    Sep 2009
    Beiträge
    11
    Hallo zusammen,
    ich habe immer das gleiche Problem:
    Source runterladen, auspacken und dann das runtergeladene Paket wegwerfen.
    Ich würde gerne einfach direkt auspacken.

    Mit Tar geht das ganz einfach:
    Hier werden z.B. die Sourcen vom Apache runtergeladen und entpackt
    Code :
    1
    
    curl http://artfiles.org/apache.org/httpd/httpd-2.2.14.tar.gz | tar xvzf -

    Aber wie sieht das mit einem zip-file aus? unzip hat irgendwie keine Möglichkeit über stdin Daten anzunehmen. Gibt es einen Trick?

    Viele Grüße
    Arne
     

  2. #2
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Hi!

    Leider geht das momentan nicht:
    Zitat Zitat von man unzip
    Archives read from standard input are not yet supported
    .Leider ist es auch nicht möglich einfach /dev/stdin als Dateinamen anzugeben.
    Auch wenn es nicht unbedingt die beste Lösung ist - das Perl-Skript unten erledigt den Job. Du kannst es z.b. unter /usr/local/bin/unzip ablegen, dann fungiert es automatisch als Wrapper für /usr/bin/unzip:
    Code Perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my($ok, @command)= qw(1 /usr/bin/unzip);
     
    sub usage {
        print STDERR `/usr/bin/unzip -h`;
        print STDERR <<"EOT;";
     
    Anstelle des Dateinamens kann genau ein mal "--" verwendet werden.
    In diesem Fall wird die Standard-Eingabe (STDIN) gelesen.
    EOT;
        exit shift;
    }
     
    for(@ARGV) {
        usage 0 if $_ eq "-h";
        if($_ eq "--") {
            usage -1 unless $ok--;
            my $filename = `whoami`;
            chomp $filename;
            $filename = "/tmp/$filename.". time() .".zip";
            binmode STDIN or die $!;
            open FILE, ">", $filename or die $!;
            binmode FILE or die $!;
            while(my $line = <STDIN>) {
                print FILE $line;
            }
            push @command, $filename;
            close FILE;
        } else {
            push @command, $_;
        }
    }
     
    exec @command;
    Das schaut dann etwa so aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    lenny:~/test$ ls
    unzip.pl  picknik-am-wegesrand.txt
    lenny:~/test$ su
    Passwort: 
    lenny:/home/enum/test# ln -s `pwd`/unzip.pl /usr/local/bin/unzip
    lenny:/home/enum/test# exit
    exit
    lenny:~/test$ zip test.zip picknik-am-wegesrand.txt 
      adding: picknik-am-wegesrand.txt (deflated 62%)
    lenny:~/test$ ls
    unzip.pl  picknik-am-wegesrand.txt  test.zip
    lenny:~/test$ rm picknik-am-wegesrand.txt 
    rm: reguläre Datei „picknik-am-wegesrand.txt“ entfernen? y
    lenny:~/test$ unzip -- < test.zip 
    Archive:  /tmp/enum.1265635053.zip
      inflating: picknik-am-wegesrand.txt  
    lenny:~/test$ ls
    unzip.pl  picknik-am-wegesrand.txt  test.zip
    lenny:~/test$
    Das Skript kann jetzt genauso wie unzip selbst verwendet werden, inklusive aller Argumente und anstelle eines Dateinamens kann jetzt "--" übergeben werden.
    Einziger Nachteil ist das interaktive Benutzereingaben unterdrückt werden wenn wirklich von STDIN gelesen wird (z.B. die Frage nach dem überschreiben von Dateien).

    Gruß
    Enum
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    @Enumerator: Du solltest lieber File:Temp (http://search.cpan.org/~jhi/perl-5.8.0/lib/File/Temp.pm) verwenden um temp. Dateinamen zu erstellen.

    Ansonsten ist das entpacken eines Zip-Archivs direkt aus einem Stream schlecht möglich, da das Verzeichnis der Einträge sich am Ende der Datei befindet (siehe http://de.wikipedia.org/wiki/Datei:ZIPformat.jpg), also erstmal die gesamte Datei runtergeladen werden muss bevor man mit dem Entpacken beginnen kann.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    @deepthroat:

    Klar, File::Temp, vor allem wenn's um Portabilität geht. Doch wir sind im Linux/Unix Forum...
    So, genug gerechtfertigt - jetzt mal im Ernst:
    Ich wollte das ursprünglich als Shellskript regeln, bin aber am "binmode" gescheitert und habe das einfach stumpf in Perl übersetzt.
    Kennst Du eine Möglichkeit, das doch ohne Perl zu schaffen?

    Gruß
    Enum
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Enumerator Beitrag anzeigen
    @deepthroat:

    Klar, File::Temp, vor allem wenn's um Portabilität geht. Doch wir sind im Linux/Unix Forum...
    Wie meinst du das? Was hat das mit Linux/Unix zu tun wenn man aus Sicherheitsgründen File::Temp verwendet was ja auch unter Windows etc. funktioniert? Ich verstehe deine Aussage irgendwie nicht...
    Zitat Zitat von Enumerator Beitrag anzeigen
    Ich wollte das ursprünglich als Shellskript regeln, bin aber am "binmode" gescheitert und habe das einfach stumpf in Perl übersetzt.
    Kennst Du eine Möglichkeit, das doch ohne Perl zu schaffen?
    Naja, mit Python

    Oder Bash
    Code bash:
    1
    2
    3
    
    tmp=$(mktemp)
    trap 'rm -f "$tmp"' EXIT
    cat > "$tmp" && unzip "$@" "$tmp" || (echo "failed."; exit 1)
    Gruß
    Geändert von deepthroat (08.02.10 um 16:09 Uhr) Grund: typo
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Avatar von Enumerator
    Enumerator Enumerator ist offline Mitglied Kamel
    Registriert seit
    Jan 2007
    Ort
    Schreibtisch
    Beiträge
    525
    Blog-Einträge
    2
    Zitat Zitat von deepthroat Beitrag anzeigen
    Was hat das mit Linux/Unix zu tun wenn man aus Sicherheitsgründen File::Temp verwendet was ja auch unter Windows etc. funktioniert?
    Das Nicht-verwenden von File::Temp hat was mit Linux/Unix zu tun sondern wenn man es trotz Kenntnis einfach außer acht lässt. Der Grund? Ich bin im Linux & Unix Forum auf ein einigermaßen interessantes Problem gestoßen, hab' es auf meinem BSD-Läppi kurz ausprobiert, später auf dem Linux-Rechner noch ein wenig 'rumgespielt und bin nicht einmal auf die Idee gekommen, dass das mickrige Skript irgendwann mal auf einem anderen System landet.

    Ich muss mich doch bedanken, wieder einmal bin ich dank Dir ein wenig schlauer...
    Ich weiß jetzt, dass cat ohne Argumente von der Standard-Eingabe liest und im Gegensatz zu einer while-read-do-echo-Schleife (*schäm*) Binärdaten nicht verstümmelt.
    Danke!
     
    Zitat Zitat von Aba Assa
    "Zitate sind so etwas wie Outsourcing des Geistes."
    just-lyrics.org :: my-lyrics.org

Ähnliche Themen

  1. Zip und unzip von byte-Array
    Von Szdnez im Forum Java
    Antworten: 2
    Letzter Beitrag: 08.09.09, 09:24
  2. Unzip Directory
    Von Develman im Forum Java
    Antworten: 2
    Letzter Beitrag: 30.03.07, 09:34
  3. Einlesen über stdin (argv)
    Von Blondie05 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 27.01.05, 11:58
  4. Unzip in Java mit Verzeichnissen
    Von AlexD1979 im Forum Java
    Antworten: 4
    Letzter Beitrag: 04.08.04, 12:35
  5. unzip
    Von CosmoKey im Forum Java
    Antworten: 1
    Letzter Beitrag: 20.01.04, 18:02