Hi, ich möchte unterverzeichnisse nach files mit bestimmtem namen durchsuchen und diese dann im jeweiligen verzeichniss mit gzip komprimieren: diese variante funktioniert: find ./ -name file.txt | xargs gzip nur dann wird file.txt eben überschrieben, was nicht passieren darf. Daher bräuchte ich etwa soetwas, um in den verzeichnissen file.txt.gz zu erstellen: find ./ -name file.txt | xargs -i gzip -c > {}.gz klappt nicht, weil wohl xargs hinter ">" seine zuständigkeit verliert?! Versuche wie:
#!/bin/bash
d=`date +%Y-%m-%d-%H%M`; find . -name current.sql -exec cp {} {}_${d} \; | xargs gzip
klappen auch nicht wirklich Wie mache ich das denn?? Vielen Dank! Thomas
Brandl, Thomas wrote:
Hi, ich möchte unterverzeichnisse nach files mit bestimmtem namen durchsuchen und diese dann im jeweiligen verzeichniss mit gzip komprimieren:
diese variante funktioniert: find ./ -name file.txt | xargs gzip
nur dann wird file.txt eben überschrieben, was nicht passieren darf. Daher bräuchte ich etwa soetwas, um in den verzeichnissen file.txt.gz zu erstellen:
find ./ -name file.txt | xargs -i gzip -c > {}.gz
klappt nicht, weil wohl xargs hinter ">" seine zuständigkeit verliert?!
Versuche wie:
#!/bin/bash
d=`date +%Y-%m-%d-%H%M`; find . -name current.sql -exec cp {} {}_${d} \; | xargs gzip
Hilft eventuell ein find . -name test.txt -exec gzip {} \; ? Joachim
Hi, ich möchte unterverzeichnisse nach files mit bestimmtem namen durchsuchen und diese dann im jeweiligen verzeichniss mit gzip komprimieren: Wäre es nicht sinnvoller diese Dateien alle in ein .tar.gz-Archiv zu
Hi On Friday 13 August 2004 10:39, Brandl, Thomas wrote: packen. Übersichtlicher wäre es jedenfalls :-)
diese variante funktioniert: find ./ -name file.txt | xargs gzip
nur dann wird file.txt eben überschrieben, was nicht passieren darf.
Ist Standard bei gzip "... Whenever possible, each file is replaced by one with the extension .gz".
Daher bräuchte ich etwa soetwas, um in den verzeichnissen file.txt.gz zu erstellen:
find ./ -name file.txt | xargs -i gzip -c > {}.gz
klappt nicht, weil wohl xargs hinter ">" seine zuständigkeit verliert?! Noch anders. {} ist gar nicht mehr im find aufruf drin. Der Endet bereits am "|". Es wird einmal xargs und damit auch nur einmal gzip aufgrufen. Ich denke, dass auch xargs seine "Zuständigkeit" beim ">" aufgibt. Diese "...|xargs ..."-Geschichten sind eh nicht so mein Geschmack. "| xargs ..... >{}.gz" kann jedenfalls nicht klappen, weil find das "{}" nicht mehr ersetzt. Pipes lassen sich nicht innerhalb von find-Aufrufen benutzen, weil diese von der darüberliegenden shell verwaltet werden. Deswegen ein neuer Vorschlag. Als Einzeiler: find ./ -name file.txt -type f -not -name '*.gz' -exec cp {} {}.copy \; -exec gzip {} \; -exec mv {}.copy {} \;
Das legt einfach vorher ne Kopie des files mit .copy hintendran an, die nach dem gzip wieder auf das alte file zurückkopiert wird. "-not -name *.gz" ist wichtig um keine .gz.gz.gz.gz.gz-Dateien zu erzeugen bis die Platte voll ist. Ist nicht wasserdicht, wenn z.B. es eine Datei file.txt und ein file.txt.copy mit unterschiedlichem Inhalt gäbe. Als etwas sauberer Mehrzeiler: <========== find ./ -name file.txt -type f -not -name '*.gz' -print |( while read datei do cat $datei |gzip -c $datei >${datei}.gz done ) =========> Wobei diese Variante über Dateinamen mit newline-character stolpern würde. Könnte man mit -print0 im find und entsprechender read-Option sicher verhindern. Ich weiß momentan aber nicht wie man "read" sagt er soll den Null-character als delimiter benutzen. Wobei newline-characters in nem Dateinamen auch eher ungewöhnlich sind :-)
Versuche wie:
#!/bin/bash
d=`date +%Y-%m-%d-%H%M`; find . -name current.sql -exec cp {} {}_${d} \; | xargs gzip
klappen auch nicht wirklich
Da wird auch an xargs nichts übergeben. Da fehlt noch irgendein -print o.ä.. Das wird von gnu-find nur dann angehängt, wenn es keine "action" (wie z.B. -exec) gibt. Laß besser diesen xargs-Murks weg und nimm mehrere -exec-Blöcke. mfg Axel
Hallo, Am Fri, 13 Aug 2004, Axel Heinrici schrieb:
Als Einzeiler: find ./ -name file.txt -type f -not -name '*.gz' -exec cp {} {}.copy \; -exec gzip {} \; -exec mv {}.copy {} \;
Das ist Unfug. Und -name 'file.txt' enthaelt keine Wildcards, das -not -name '*.gz' ist also ueberfluessig. Und das rumkopieren... $ find . -type f ./file.txt ./a/foo ./a/file.txt ./b/file.txt ./c/foo ./foo $ find . -type f -name 'file.txt' -exec /bin/sh -c 'gzip -vc {} > {}.gz' \; ./file.txt: 0.0% ./a/file.txt: 0.0% ./b/file.txt: 0.0% $ find . -type f ./file.txt ./a/foo ./a/file.txt ./a/file.txt.gz ./b/file.txt ./b/file.txt.gz ./c/foo ./foo ./file.txt.gz -dnh -- The Universe -- some information to help you live in it. 2 IMPORTS: None.
participants (4)
-
Axel Heinrici
-
Brandl, Thomas
-
David Haller
-
Joachim Kieferle