Ich suche alle zip-Dateien, die einem bestimmten Muster entsprechen und will diese entpacken. Das läuft mal grundsätzlich so cd $ENTPACKDIR find $DIR -type f -regex ".*75_.*" -print0 | xargs -r -0 -n1 unzip 1. Wie muss ich das Muster ergänzen, dass nach .zip am Ende eingeschränkt wird? Die Suche liefert aber jetzt schon auch das richtige Ergebnis. 2. Unzip entpackt den kompletten Pfad, ich möchte aber in $ENTPACKDIR nur die Datei alleine stehen haben, unabhängig von der Tiefe der gezippten Verzechnisse. 3, Versuche ich ähnlich wie bei o.a. "find | xargs" nur die gefundenen Dateien nach $ENTPACKDIR zu kopieren, dann wird das Verzeichnis nicht gefunden, ich habe da also irgendein Syntaxproblem. Statt unzip gebe ich einfach cp -v $ENTPACKDIR an. Al
Hallo, Am Die, 05 Sep 2006, Al Bogner schrieb:
Ich suche alle zip-Dateien, die einem bestimmten Muster entsprechen und will diese entpacken.
Das läuft mal grundsätzlich so
cd $ENTPACKDIR find $DIR -type f -regex ".*75_.*" -print0 | xargs -r -0 -n1 unzip
1. Wie muss ich das Muster ergänzen, dass nach .zip am Ende eingeschränkt wird? Die Suche liefert aber jetzt schon auch das richtige Ergebnis.
find "$DIR" -type f -regex ".*75_.*\.zip" -print0 | xargs -r -0 -n1 unzip Aber -regex brauchst du in dem Fall gar nicht: find "$DIR" -type f -name "*75_*.zip" -print0 | xargs -r -0 -n1 unzip
2. Unzip entpackt den kompletten Pfad, ich möchte aber in $ENTPACKDIR nur die Datei alleine stehen haben, unabhängig von der Tiefe der gezippten Verzechnisse.
$ unzip -h [..] -j junk paths (do not make directories) Ansonsten: suchst du evtl. auch die Option '-d exdir' von unzip?
3, Versuche ich ähnlich wie bei o.a. "find | xargs" nur die gefundenen Dateien nach $ENTPACKDIR zu kopieren, dann wird das Verzeichnis nicht gefunden, ich habe da also irgendein Syntaxproblem. Statt unzip gebe ich einfach cp -v $ENTPACKDIR an.
Ueberlege dir, was 'cp' zu sehen bekommt: cp -v $ENTPACKDIR dateiname dateiname ... dateiname Ist das korrekt? $ cp --help Usage: cp [OPTION]... SOURCE DEST or: cp [OPTION]... SOURCE... DIRECTORY Mit einem aktuellem(!) GNU cp gibt's Abhilfe: suse91 $ cp --help --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY suse91 $ cp --version cp (coreutils) 5.2.1 $ cp --version cp (GNU fileutils) 4.0 Kennt diese Option noch nicht. Alternativ, wenn du eh pro Datei ein cp anwirfst: find .. -exec cp "{}" "${ENTPACKDIR}/" \; Und noch ne Variante waere es, die Dateien mittels tar/cpio zu kopieren, Schema: GNU tar: find .. -print0 | tar c -T - --null | tar -x -C "$ENTPACKDIR" Andere tars: find .. -print | xargs tar -cf - | ( cd "$ENTPACKDIR" && tar -x -f - ; ) Mit cpio geht es aehnlich. HTH, -dnh -- The only possible interpretation of any research whatever in the "social sciences" is: some do, some don't. -- Ernest Rutherford
Am Dienstag, 5. September 2006 22:28 schrieb David Haller: Hallo David,
find "$DIR" -type f -regex ".*75_.*\.zip" -print0 | xargs -r -0 -n1 unzip
Aber -regex brauchst du in dem Fall gar nicht:
find "$DIR" -type f -name "*75_*.zip" -print0 | xargs -r -0 -n1 unzip ... $ unzip -h [..] -j junk paths (do not make directories)
Ansonsten: suchst du evtl. auch die Option '-d exdir' von unzip?
Wäre eine Alternative, ich denke aber da ist kein großer Unterschied.
Versuche ich ähnlich wie bei o.a. "find | xargs" nur die gefundenen Dateien nach $ENTPACKDIR zu kopieren, dann wird das Verzeichnis nicht gefunden, ich habe da also irgendein Syntaxproblem. Statt unzip gebe ich einfach cp -v $ENTPACKDIR an.
Ueberlege dir, was 'cp' zu sehen bekommt:
cp -v $ENTPACKDIR dateiname dateiname ... dateiname
Ist das korrekt?
Ja
$ cp --help ... or: cp [OPTION]... SOURCE... DIRECTORY
Ich hatte das so interpretiert, dass das letzte Argument das Ziel ist. Es ist aber im konkreten Fall kein Thema mehr. Bis hierher habe ich mein Problem gelöst. Nun kommt noch eine Anforderung dazu, die ich notfalls auch manuell durch kurzes Probieren / Schätzen machen kann. Es geht um das Kopieren von Dateien auf eine SD-Karte. Nehmen wir an, dass ich max. 100MB der vorher extrahierten Dateien auf die Karte kopieren möchte um sie bei Bedarf unterwegs am Handy auf Karte zur Verfügung zu haben. Die extrahierten Dateien sind 9-stellig durchnummeriert, höhere Nummern haben Vorrang, d.h. es soll auf jeden Fall die höchste Nummer kopiert werden, dann die 2. höchste, etc., jedoch wieder mit der Einschränkung, dass die ersten beiden Stellen höchstens mit "06" (aktuelles Jahr) beginnen. Es ist auszuschließen, dass 1 Datei über 100MB hat, die Dateien liegen eher im kB-Bereich als im MB-Bereich. Es gibt auch Dateien die zwischen 50-99 beginnen und die will ich nicht haben. Beispiel 001234501_irgendwas.ext ... 061234568_wasanderes.ext 061234569_nochwasanderes.ext Muss ich das Datei für Datei in einer Schleife analysieren? WIe macht man so was möglichst effizient? Kann ich da bereits beim Extrahieren der zip-Datei etwas mit xargs machen? Al
Hallo, Am Mit, 06 Sep 2006, Al Bogner schrieb:
Am Dienstag, 5. September 2006 22:28 schrieb David Haller:
find "$DIR" -type f -regex ".*75_.*\.zip" -print0 | xargs -r -0 -n1 unzip
Aber -regex brauchst du in dem Fall gar nicht:
find "$DIR" -type f -name "*75_*.zip" -print0 | xargs -r -0 -n1 unzip ... $ unzip -h [..] -j junk paths (do not make directories)
Ansonsten: suchst du evtl. auch die Option '-d exdir' von unzip?
Wäre eine Alternative, ich denke aber da ist kein großer Unterschied.
Ja. Aber das '-j' sollte doch sein, was du gesucht hast, oder?
Versuche ich ähnlich wie bei o.a. "find | xargs" nur die gefundenen Dateien nach $ENTPACKDIR zu kopieren, dann wird das Verzeichnis nicht gefunden, ich habe da also irgendein Syntaxproblem. Statt unzip gebe ich einfach cp -v $ENTPACKDIR an.
Ueberlege dir, was 'cp' zu sehen bekommt:
cp -v $ENTPACKDIR dateiname dateiname ... dateiname
Ist das korrekt?
Ja
Ja, das bekommt cp von dir, aber es ist eben flasch! s.u.
$ cp --help ... or: cp [OPTION]... SOURCE... DIRECTORY
Ich hatte das so interpretiert, dass das letzte Argument das Ziel ist.
Eben. Und somit ist die Zeile oben, die dein " | xargs cp" erzeugt flasch.
Es geht um das Kopieren von Dateien auf eine SD-Karte. Nehmen wir an, dass ich max. 100MB der vorher extrahierten Dateien auf die Karte kopieren möchte um sie bei Bedarf unterwegs am Handy auf Karte zur Verfügung zu haben. Die extrahierten Dateien sind 9-stellig durchnummeriert, höhere Nummern haben Vorrang, d.h. es soll auf jeden Fall die höchste Nummer kopiert werden, dann die 2. höchste, etc., jedoch wieder mit der Einschränkung, dass die ersten beiden Stellen höchstens mit "06" (aktuelles Jahr) beginnen. Es ist auszuschließen, dass 1 Datei über 100MB hat, die Dateien liegen eher im kB-Bereich als im MB-Bereich. Es gibt auch Dateien die zwischen 50-99 beginnen und die will ich nicht haben.
Beispiel
001234501_irgendwas.ext ... 061234568_wasanderes.ext 061234569_nochwasanderes.ext
Muss ich das Datei für Datei in einer Schleife analysieren? WIe macht man so was möglichst effizient?
Ich wuerde (natuerlich) zu perl greifen, damit kann man sogar noch die Zip-Dateien auspacken und hat u.a. ein 'stat' usw. um beliebig zu filtern / sortieren, was man will ;) Ansonsten (alles komplett UNGETESTET): sumsize=0 ls 06* | sort -n | while read f; do let sumsize += `stat -c '+%s' "$f"`; cp "$f" /ZIEL test $sumsize -gt 100000000 && break done Wobei, statt $sumsize sollte man vielleicht besser schauen, wieviel Platz noch auf /ZIEL ist. (df /ZIEL)... Also: do s=`du -k "$f" | cut -f 1` test $s -lt `df -k /ZIEL/ | awk '/dev/{print $4;}'` && break cp "$f" /ZIEL/ sync done oder sowas...
Kann ich da bereits beim Extrahieren der zip-Datei etwas mit xargs machen?
Sind mehrere Dateien in den einzelnen .zip-Dateien? Ausserdem habe ich das was du wie/wann kopieren und auspacken willst noch nicht kapiert. -dnh -- BE MAD! IT HELPS!
Am Donnerstag, 7. September 2006 02:38 schrieb David Haller: Hallo David,
Wäre eine Alternative, ich denke aber da ist kein großer Unterschied.
Ja. Aber das '-j' sollte doch sein, was du gesucht hast, oder?
Ja, danke, ist schon ok, ich bezoge mich auf "exdir"
Ja, das bekommt cp von dir, aber es ist eben flasch! s.u.
$ cp --help
Ich darf mir selbst ein RTFM _genau_ schreiben ;-)
Ansonsten (alles komplett UNGETESTET):
Vielen Dank, ich werde mir das in den nächsten Tagen (ASAP) mal ansehen.
sumsize=0 ls 06* | sort -n | while read f; do let sumsize += `stat -c '+%s' "$f"`; cp "$f" /ZIEL test $sumsize -gt 100000000 && break done
Wobei, statt $sumsize sollte man vielleicht besser schauen, wieviel Platz noch auf /ZIEL ist. (df /ZIEL)... Also:
do s=`du -k "$f" | cut -f 1` test $s -lt `df -k /ZIEL/ | awk '/dev/{print $4;}'` && break cp "$f" /ZIEL/ sync done
oder sowas...
Ok, in meinem Fall ist das alles nicht so genau. Ich schreibe einfach eine 128MB-SD-Karte fast voll, die vorher formatiert wurde und möchte darauf Dateien mithaben, die ich vielleicht brauche. Es kann aber auch sein, dass es mal eine andere SD-Karte ist, auf die mehr passt. Das anzupassen ist natürlich kein Problem.
Kann ich da bereits beim Extrahieren der zip-Datei etwas mit xargs machen?
Sind mehrere Dateien in den einzelnen .zip-Dateien?
Zu 99,99% ja, d.h. 1 Datei in der Zip-Datei wäre die große Ausnahme, kann aber schon möglich sein. Maximal dürften in einer Zip-Datei 300 Dateien sein. Das ist alles sehr variabel, es hängt einfach von den jeweiligen Bedürfnissen ab.
Ausserdem habe ich das was du wie/wann kopieren und auspacken willst noch nicht kapiert.
Ich probiere es mit anderen Worten zu erklären. Auf der HD, genau genommen auf einem Server mit NFS-Verzeichnis sind gezippte Dateien verstreut, auf die ein Client Zugriff hat. Es geht erstens einmal darum alle therotisch interessanten Zip-Dateien per Muster zu finden. Das passt ja schon. Als nächstes Ziel sollen möglichst viele entpackte Dateien auf eine SD-Karte kommen, wobei auf de SD-Karte 1 Ordner dafür vorgesehen ist, es sollen aber keine Unterverzeichnisse auf der SD-Karte verwendet werden. Da sicher nicht alle Dateien auf die SD-Karte passen, muss irgendwie selektiert werden und da gebe ich vor, neuere Dateien zuerst, wobei neuer durch den Dateinamen, der mit einer Zahl (ähnlich Datum) bestimmt wird und nicht durch das letzte Änderungsdatum. Zur Zeit werden einfach mit 2-3 Versuchen ca. 100MB rüberkopiert. Es ist auch nicht so tragisch, wenn es nur 90MB sind. Die Dateien auf der SD-Karte mitzuhaben ist einfach "nice to have" und ob die SD-Karte mit 128MB nun einfach rumliegt oder mit Daten im Handy ist, ist ziemlich egal. Al
Hallo, Am Don, 07 Sep 2006, Al Bogner schrieb:
Am Donnerstag, 7. September 2006 02:38 schrieb David Haller: [..] Ok, in meinem Fall ist das alles nicht so genau. Ich schreibe einfach eine 128MB-SD-Karte fast voll, die vorher formatiert wurde und möchte darauf Dateien mithaben, die ich vielleicht brauche. Es kann aber auch sein, dass es mal eine andere SD-Karte ist, auf die mehr passt. Das anzupassen ist natürlich kein Problem.
Du koenntest auch einfach so lange kopieren bis die Fehlermeldung "no more space left on device" kommt, also: ... do cp "$f" /ZIEL || { rm -f "/ZIEL/$f"; break; } done sync Das rm damit die unvollstaendige Datei nicht auf der Karte bleibt. Das hat auch den Vorteil, dass die Karte nicht so oft schreiben muss bzw. dass die nicht mehr passende Datei auf die Karte geschrieben wird. Dazu darf aber die Karte nicht mit "sync" gemounted sein!
Kann ich da bereits beim Extrahieren der zip-Datei etwas mit xargs machen?
Sind mehrere Dateien in den einzelnen .zip-Dateien?
Ausserdem habe ich das was du wie/wann kopieren und auspacken willst noch nicht kapiert. [..] Es geht erstens einmal darum alle therotisch interessanten Zip-Dateien per Muster zu finden. Das passt ja schon. Als nächstes Ziel sollen möglichst viele entpackte Dateien auf eine SD-Karte kommen, wobei auf de SD-Karte 1 Ordner dafür vorgesehen ist, es sollen aber keine Unterverzeichnisse auf der SD-Karte verwendet werden. Da sicher nicht alle Dateien auf die SD-Karte
Zu 99,99% ja, d.h. 1 Datei in der Zip-Datei wäre die große Ausnahme, kann aber schon möglich sein. Maximal dürften in einer Zip-Datei 300 Dateien sein. Das ist alles sehr variabel, es hängt einfach von den jeweiligen Bedürfnissen ab. [..] passen, muss irgendwie selektiert werden und da gebe ich vor, neuere Dateien zuerst, wobei neuer durch den Dateinamen, der mit einer Zahl (ähnlich Datum) bestimmt wird und nicht durch das letzte Änderungsdatum.
Also erst alle (oder auch selektierte) Zip-Dateien mit '-j' auspacken, die gewuenschten Dateien zum kopieren raussuchen und die dann kopieren... Ich denke, da passt es, wenn du einfach kopierst bis Fehler. Direkt auf die Karte entpacken wuerde ich nicht, da solche Flash-Medien nur begrenzte Schreibzyklen ueberleben. -dnh -- The speed at which a mistyped command executes is directly proportional to the amount of damage done. -- Joe Zeff
participants (2)
-
Al Bogner
-
David Haller