Hallo, meine Skript für eine Tagessicherung hängt an Dateinamen mit Leerzeichen: cd /sicherung tar cT - `find /work -iname "*" -mtime -1 -type f` \ --atime-preserve -p | tar xf - --atime-preserve Fehlermeldung bei Dateinamen mit Leerzeichen: tar: Haus: Kann stat nicht ausführen. tar: 17.07.03.max: Kann stat nicht ausführen. Die Ursprungsdatei: "Haus 17.07.03.max" Habe find /work -iname "*" -mtime -1 -type f auch schon in ein Datei umgeleitet und dann Anführungszeichen um die Namen gesetzt oder ein \ vor die Leerzeichen: kein Erfolg. Wie geht's? thx Ekkard
Zitat von Ekkard Gerlach
meine Skript für eine Tagessicherung hängt an Dateinamen mit Leerzeichen:
cd /sicherung tar cT - `find /work -iname "*" -mtime -1 -type f` \ --atime-preserve -p | tar xf - --atime-preserve
Hmm probiers doch mal so: find /work -iname "*" -mtime -1 -type f|xargs tar xf - --atime-preserve Evtl. kann man auch noch ein -exec echo \"{}\" \; ins find einbauen, sollte aber IMHO eigentlich nicht erforderlich sein. -- Erhard Schwenk Akkordeonjugend Baden-Württemberg - http://www.akkordeonjugend.de k-itx.net Webhosting - http://webhosting.k-itx.net
* Erhard Schwenk schrieb:
Zitat von Ekkard Gerlach
: meine Skript für eine Tagessicherung hängt an Dateinamen mit Leerzeichen:
cd /sicherung tar cT - `find /work -iname "*" -mtime -1 -type f` \ --atime-preserve -p | tar xf - --atime-preserve
Hmm probiers doch mal so:
find /work -iname "*" -mtime -1 -type f|xargs tar xf - --atime-preserve
tar: /work/A/datei: Not found in archive tar: 1.txt: Not found in archive tar: /work/A/datei: Not found in archive tar: 2.txt: Not found in archive
Evtl. kann man auch noch ein -exec echo \"{}\" \; ins find einbauen, sollte aber IMHO eigentlich nicht erforderlich sein.
tar: /work/A/datei 1.txt: Not found in archive tar: /work/A/datei 2.txt: Not found in archive Ein ls /work/A/datei\ 1.txt funktioniert aber prächtig. ekkard
Zitat von Ekkard Gerlach
find /work -iname "*" -mtime -1 -type f|xargs tar xf - --atime-preserve
tar: /work/A/datei: Not found in archive tar: 1.txt: Not found in archive tar: /work/A/datei: Not found in archive tar: 2.txt: Not found in archive
Urgs, Fehler von mir. Ersetze tar xf durch tar cf, also so in der Richtung: find /work -iname "*" -mtime -1 -type f|xargs tar cf archive.tar --atime-preserve
Evtl. kann man auch noch ein -exec echo \"{}\" \; ins find einbauen, sollte aber IMHO eigentlich nicht erforderlich sein.
tar: /work/A/datei 1.txt: Not found in archive tar: /work/A/datei 2.txt: Not found in archive
Klar, tar xf - will extrahieren, was aus dem stdin kommt. Das ist natürlich nonsense. Du willst ein Archiv erzeugen, also cf, und entweder nach stdout schreiben (dann cf -) oder in ein file (dann cf file). -- Erhard Schwenk Akkordeonjugend Baden-Württemberg - http://www.akkordeonjugend.de k-itx.net Webhosting - http://webhosting.k-itx.net
* Erhard Schwenk schrieb:
Zitat von Ekkard Gerlach
: find /work -iname "*" -mtime -1 -type f|xargs tar xf - --atime-preserve
tar: /work/A/datei: Not found in archive tar: 1.txt: Not found in archive tar: /work/A/datei: Not found in archive tar: 2.txt: Not found in archive
Urgs, Fehler von mir. Ersetze tar xf durch tar cf, also so in der Richtung:
find /work -iname "*" -mtime -1 -type f|xargs tar cf archive.tar --atime-preserve
tar: /work/A/datei: Cannot stat: No such file or directory tar: 1.txt: Cannot stat: No such file or directory tar: /work/A/datei: Cannot stat: No such file or directory tar: 2.txt: Cannot stat: No such file or directory tar: Error exit delayed from previous errors
Evtl. kann man auch noch ein -exec echo \"{}\" \; ins find einbauen, sollte aber IMHO eigentlich nicht erforderlich sein.
Hurrah!! mit -exec echo \"{}\" \; und mit Erstellung eines ARchives archive.tar im Gespann gehts!!! Danach kann ich es gewöhnlich wieder auspacken und habe datei 1.txt, .... Was macht eigentlich -exec echo \"{}\" \; ? thx Ekkard
* On Thu, 17 Jul 2003 at 17:23 +0200, Ekkard Gerlach wrote:
* Erhard Schwenk schrieb:
Zitat von Ekkard Gerlach
: [...] find /work -iname "*" -mtime -1 -type f|xargs tar cf archive.tar --atime-preserve tar: /work/A/datei: Cannot stat: No such file or directory [...]
Nimm mal das hier: find /work -iname "*" -mtime -1 -type f -print0|xargs -0 tar cf archive.tar --atime-preserve xargs erwartet normal auf stdin eine Liste von Dateinamen, die durch Whitespace separiert sind (also z.B. Leerzeichen oder Zeilenumbrüche) -> das funktioniert mit Leerzeichen in Dateinamen nicht. Mit -print0 wird find instruiert, die Dateinamen nicht durch Zeilenumbrüche, sondern durch Nullbytes zu separieren; -0 sagt xargs dann, daß es nur an Nullbytes trenn soll. Nachdem ein Dateiname sowieso kein Nullbyte enthalten kann, kriegst Du so alle möglichen Dateinamen durch.
Evtl. kann man auch noch ein -exec echo \"{}\" \; ins find einbauen, sollte aber IMHO eigentlich nicht erforderlich sein.
Hurrah!! mit -exec echo \"{}\" \; und mit Erstellung eines ARchives archive.tar im Gespann gehts!!! Danach kann ich es gewöhnlich wieder auspacken und habe datei 1.txt, ....
Was macht eigentlich -exec echo \"{}\" \; ?
Es wird jeder Dateiname in Anführungszeichen verpackt ausgegeben. Rufs mal einfach ohne das |xargs auf, dann siehst Du, was ich meine. /apm -- GPG welcome, request public key: mailto:adalbert+key@lopez.at
* Ekkard Gerlach schrieb am Donnerstag, 2003-07-17:
Was macht eigentlich -exec echo \"{}\" \; ?
-exec führt für jede Datei, die find findet, alles bis zum nächsten Semikolon aus. Das muß vor der Shell geschützt werden, also muß ein Backslash davor. {} wird durch den Dateinamen ersetzt und die Anführungszeichen müssen auch geschützt werden, weil sie in der Ausgabe von echo wieder auftauchen sollen, denn tar braucht sie. Falls find gerade "a/b/c/datei 1" gefunden hat, wird aus dem Befehl ein echo \"a/b/c/datei 1\" . Probier's aus. -- Christian Ullrich Registrierter Linux-User #125183 "Remember: 'I am a person. I have a right to the ball.'"
Hallo, On Thu, 17 Jul 2003, Ekkard Gerlach schrieb:
Hallo,
meine Skript für eine Tagessicherung hängt an Dateinamen mit Leerzeichen:
cd /sicherung tar cT - `find /work -iname "*" -mtime -1 -type f` \ ^^^^^^... was soll diese Kombination? oder hattest du statt dem '-T -' ein '-f -'?
--atime-preserve -p | tar xf - --atime-preserve
Probiere mal dies: find /work/ -type f -mtime -1 -print0 \ | tar -c -p --atime-preserve --null -T - -f - \ | tar -x -p --atime-preserve -f - Mit '-T -' liest tar die Dateinamen von stdin, und mit --null erwartet es die Dateinamen durch '\0' (ASCII NUL) getrennt, und genau das macht find mit '-print0'. '-iname "*"' ist ueberfluessig. -name "*" waere auch das gleiche weil "*" sowieso auf alles passt. -dnh -- Do infants have as much fun in infancy as adults do in adultery?
On Don, 17 Jul 2003 at 19:23 (+0200), David Haller wrote: [...]
Probiere mal dies:
find /work/ -type f -mtime -1 -print0 \ | tar -c -p --atime-preserve --null -T - -f - \ | tar -x -p --atime-preserve -f -
Mit '-T -' liest tar die Dateinamen von stdin, und mit --null erwartet es die Dateinamen durch '\0' (ASCII NUL) getrennt, und genau das macht find mit '-print0'. '-iname "*"' ist ueberfluessig. -name "*" waere auch das gleiche weil "*" sowieso auf alles passt.
Das kann ich so nicht stehenlassen. * passt eben _nicht_ auf alles, alle mit einem . beginnenden Dateien werden hier ignoriert (auch wenn ich nicht glaube, dass das so gewollt war). Jan P.S.: mal sehen, ob ich wieder ignoriert werde :-(
Hallo, On Fri, 18 Jul 2003, Jan Trippler schrieb:
On Don, 17 Jul 2003 at 19:23 (+0200), David Haller wrote: [...]
Probiere mal dies:
find /work/ -type f -mtime -1 -print0 \ | tar -c -p --atime-preserve --null -T - -f - \ | tar -x -p --atime-preserve -f -
Mit '-T -' liest tar die Dateinamen von stdin, und mit --null erwartet es die Dateinamen durch '\0' (ASCII NUL) getrennt, und genau das macht find mit '-print0'. '-iname "*"' ist ueberfluessig. -name "*" waere auch das gleiche weil "*" sowieso auf alles passt.
Das kann ich so nicht stehenlassen. * passt eben _nicht_ auf alles, alle mit einem . beginnenden Dateien werden hier ignoriert (auch wenn ich nicht glaube, dass das so gewollt war).
Aeh, stimmt... Ich hatte mich durch ".kde" usw. irritieren lassen ;(( Also 'GNU-find' verwendet also offenbar "normales" globbing (-> 'man 7 glob'). Abgesehen davon (also dem find, und wie du habe ich meine Zweifel, dass das "-iname '*'" das war, was gewollt war), hast du aber nix zu kritteln?
P.S.: mal sehen, ob ich wieder ignoriert werde :-(
Haeh? -dnh -- If anyone does have a spare 8Kg spider I could borrow, I'd like to introduce it to the joys of red meat and put it in charge of user discipline... -- Chris King, in the Monastery
On Fre, 18 Jul 2003 at 22:41 (+0200), David Haller wrote:
On Fri, 18 Jul 2003, Jan Trippler schrieb: [...]
Das kann ich so nicht stehenlassen. * passt eben _nicht_ auf alles, alle mit einem . beginnenden Dateien werden hier ignoriert (auch wenn ich nicht glaube, dass das so gewollt war).
Aeh, stimmt... Ich hatte mich durch ".kde" usw. irritieren lassen ;(( Also 'GNU-find' verwendet also offenbar "normales" globbing (-> 'man 7 glob').
Nicht nur der GNU-find. Ich kenne keinen, der regex benutzt (und dann wäre eher das Suchmuster .* angebracht ;-). GNU find hat ja noch den Vorteil, dass man mit -regex bzw. -iregex sehr wohl reguläre Ausdrücke verarbeiten kann - das haben die anderen IIRC nicht.
Abgesehen davon (also dem find, und wie du habe ich meine Zweifel, dass das "-iname '*'" das war, was gewollt war), hast du aber nix zu kritteln?
Nö, hebe ich mir für das nächste Mal auf. *fg* Jan
participants (6)
-
Adalbert Michelic
-
Christian Ullrich
-
David Haller
-
Ekkard Gerlach
-
Erhard Schwenk
-
Jan.Trippler@t-online.de