Pro-Linux.de

Pro-Linux

Pro-Linux Diskussions- und Hilfeforum
Aktuelle Zeit: 21. Nov 2018 12:48

Alle Zeiten sind UTC+01:00




Ein neues Thema erstellen  Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: zip file aufteilen mit unix/linux
BeitragVerfasst: 19. Jun 2006 14:27 
Offline

Registriert: 19. Jun 2006 14:24
Beiträge: 1
Hallo,

ich habe eine Frage: Ich muss eine größere Datenmenge (ca. 10.000) auf mehrere ZIP-Files aufteilen. Gibt es da unter unix einen schnellen Weg mit zip? d.h. einen Befehl mit dem alle files in einem Verzeichnis gezippt werden und zwar in 500 Blöcken? Für Hilfe wäre ich sehr sehr dankbar.

Beste Grüße
Markus


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 20. Jun 2006 8:13 
Offline
prolinux-forum-admin
Benutzeravatar

Registriert: 14. Jan 2000 15:37
Beiträge: 699
Wohnort: Jülich
Hi,

ein festes Kommando dazu gibt es nicht, aber man kann mittels awk schnell ein kleines Skriptchen dazu schreiben:
Code:
#!/bin/bash

ls | awk '
BEGIN {
        zipfilenum = 1
        zipfilebasename = "data"
        zipformat="%s%03d.zip"
        zipfile = sprintf (zipformat, zipfilebasename, zipfilenum)
        zipcommandbase = "zip -q -@ "
        zipcommand = zipcommandbase zipfile
}

{
        print $0 | zipcommand
        if (0 == NR % 500) {
                close (zipcommand)
                zipfilenum++
                zipfile = sprintf (zipformat, zipfilebasename, zipfilenum)
                zipcommand = zipcommandbase zipfile
        }
}'
Im BEGIN-Fall werden nur ein paar Variablen vordefiniert; hier kannst Du den Stammnamen der Archive u.ä. ändern. Ansonsten listet ls alle Dateien auf, die alle in das von stdin lesende zip-Kommando gepipet werden. Wenn wieder 500 Dateien komplett verarztet wurden, wird das Kommando beendet und damit das Zip-Archiv geschlossen und für die nächsten 500 Dateien das neue Kommando generiert.

War's das, was Du suchtest?

Jochen

_________________
Die grösste Lüge der EDV? "Mal eben..."


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16. Jul 2006 13:02 
Das dürfte nicht funktionieren:
Code:
...
{ 
        print $0 | zipcommand 
        if (0 == NR % 500) { 
                close (zipcommand) 
                zipfilenum++ 
                zipfile = sprintf (zipformat, zipfilebasename, zipfilenum) 
                zipcommand = zipcommandbase zipfile 
        } 
}
Während awk über alle Parameter mit print iteriert, bleibt die Ausgabe wohl offen (bin kein awk-Kenner) und "zip -q -@ " bekommt alles als einen String. Da zip beim "lesen aus Eingabestrom" wohl ein NL (oder/und CR?) als Recordseparator interpretiert, könnte printf( "%s\n", $0 ) | zipcommand eine brauchbare aber unsaubere, nicht allgemeingültige Lösung sein. Eine solche wird es zusammen mit zip so aber auch nicht geben, denn wenn ein Dateiname ein CR/NL enthält, funktioniert es eben nicht mehr.

############

Zu Ausgangsfrage: Hätte eher aufteilen des Daten-Volumens (multi-volume archive) vermutet, obwohl die Formulierung ... größere Datenmenge (ca. 10.000) ... Jochens Stückzahl-Interpretation näher legt.

MfG
Gast


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 16. Jul 2006 20:17 
Offline
prolinux-forum-admin
Benutzeravatar

Registriert: 14. Jan 2000 15:37
Beiträge: 699
Wohnort: Jülich
Zitat:
Das dürfte nicht funktionieren:
Mal ausprobiert? Ich habe das Skript funktionierend mittels Copy'n'Paste übernommen... Aber ich gebe gerne zu, dass es bei Dateinamen mit Newlines Probleme geben kann.
Zitat:
Während awk über alle Parameter mit print iteriert
?!? $0 enthält die Eingabezeile, also einen Dateinamen. Nach jedem print erfolgt ein Newline, also werden die Dateinamen zeilenweise an zip übergeben. Enthält ein Dateiname ein Newline, interpretiert der awk diesen bereits als zwei unterschiedliche Eingabezeilen; das Problem ist also grundsätzlicher Art. Selbst wenn man sich mit "find ... -print0" und "RS="\0" Mühe gibt, trifft letzten Endes Dein Kommentar, dass zip damit Schwierigkeiten hätte.

Jochen

_________________
Die grösste Lüge der EDV? "Mal eben..."


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18. Jul 2006 4:34 
Offline

Registriert: 03. Mär 2006 23:16
Beiträge: 430
Code:
zipsplit
?


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 18. Jul 2006 16:48 
Komsomolze,
ja, zipsplit u.ä., aber John lies ja nichts mehr verlauten.

Jochen, awk
Hast Du recht, ein einfaches print packt ein NL mit 'ran. Asche auf meine Glatze. Habe gerade praktische awk-Erfahrung gesammelt. Bin eben kein awk-Kenner und habe mich von Perl-print oder C-printf leiten lassen. Awk-print entpricht halt C-puts.
Jo, bin noch lernfähig finde vielleicht gar Freude an awk, aber wenn mir Jochen hierfür kein Heilmittel nennen kann:
» ... Enthält ein Dateiname ein Newline, interpretiert der awk diesen bereits als zwei unterschiedliche Eingabezeilen ... «
wird nicht all zu viel mit Freude. Klar ein NL ist nun mal ein (Eingabe-)Zeilentrenner, aber Du weißt schon, was ich meine.

Ist ein recht allgemeines Ärgernis mit quoten, escapen, Zeichensätzen ...
Dateidialoge (irgendwelcher Toolkits) steigen aus, wenn sie mit den Zeichensätzen nicht klar kommen, da ist es oft nicht mal möglich ein File zu öffnen, obwohl die angebotenen Zeichen nichts anderes als einfache Bytes sind und genau so (und nicht irgendwie missinterpretiert) an das System (fopen) zurückgereicht werden
brauchen.

####

ls | zip -@ daszipfile.zip
zip warning: name not matched: File mit
zip warning: name not matched: NL
adding: File_0 (stored 0%)
adding: File_1 (stored 0%)

ls hat ja die Option Q (Lob den Machern!), nur zip und die meisten anderen Programme können damit nichts anfangen.

ls -Q | zip -@ daszipfile.zip
zip warning: name not matched: "File mit \nNL"
zip warning: name not matched: "File_0"
zip warning: name not matched: "File_1"


Nach oben
   
 Betreff des Beitrags:
BeitragVerfasst: 19. Jul 2006 0:05 
Offline

Registriert: 03. Mär 2006 23:16
Beiträge: 430
Code:
for i in * ; do echo $i ; done | zip -@ daszipfile.zip
oder
for i in * ; do echo \"$i\" ; done | zip -@ daszipfile.zip
?


Nach oben
   
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen  Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC+01:00


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.
Sie dürfen keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Limited
Deutsche Übersetzung durch phpBB.de