Alexander Puchmayr wrote:
Am Dienstag, 5. Februar 2002 13:21 schrieben Sie:
wenn ich #!/usr/bin/bash for file in `find /home/ralph` do echo "$file" done ausführe, dann bekomme ich bei Dateinamen die (leider) ein Leerzeichen enthalten (z.B."/home/ralph/Mail/.Unsent Messages.summary") die folgenden Fehlermeldungen:
find: /home/ralph/Mail/.Unsent: Datei oder Verz. nicht gefunden find: Messages.summary: Datei oder Verz. nicht gefunden
Wie kann man dieses "Auftrennen" des Dateinamens in einer solchen Schleife vermeiden?
Versuchs damit: find /home/ralph -type f -exec echo "{}" \;
Hilft leider nicht. Das gleiche auch mit dem Vorschlag von Jürgen. Ich glaube das Problem ist in diesem Falle nicht bei "find", sondern bei "for" zu suchen. "for" nimmt (offenbar zwingend) als Trennzeichen _immer_ ein Leerzeichen. Das kann man "for" offenbar auch nicht ändern. :-( Gibt es (als Workaround) vielleicht eine Möglichkeit ohne "for" eine Schleife zu machen? Ralph
* Ralph Müller schrieb am 05.Feb.2002:
Ich glaube das Problem ist in diesem Falle nicht bei "find", sondern bei "for" zu suchen. "for" nimmt (offenbar zwingend) als Trennzeichen _immer_ ein Leerzeichen. Das kann man "for" offenbar auch nicht ändern. :-(
Doch kann man. Was die bash als Trennzeichen nimmt steht in der Variablen $IFS, einfach diese Variable überschreiben und man hat ein anderes Trennzeichen. Trotzdem der Vorschlag alles in "..." zu setzen halte ich in diesem Fall für besser. (Welches Trennzeichen sollte man auch nehmen, könnte ja alles im Namen auftauchen.) Bernd -- Umsteiger von Microsoft Windows xx? Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen? Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen. |Zufallssignatur 1
Hallo, On Tue, 05 Feb 2002, Ralph Müller wrote:
Alexander Puchmayr wrote:
Versuchs damit: find /home/ralph -type f -exec echo "{}" \;
Hilft leider nicht. Das gleiche auch mit dem Vorschlag von Jürgen.
Ich glaube das Problem ist in diesem Falle nicht bei "find", sondern bei "for" zu suchen. "for" nimmt (offenbar zwingend) als Trennzeichen _immer_ ein Leerzeichen. Das kann man "for" offenbar auch nicht ändern. :-(
Doch. Das geht. man bash -> IFS. dh@slarty[4]:/tmp/test (0) $ mkdir 'b0rken filenames'; cd 'b0rken filenames' [ein paar touch] dh@slarty[4]:/tmp/test/b0rken\ filenames (0) $ ls -lab insgesamt 1 -rw-r--r-- 1 dh dh 0 Feb 5 21:17 --help drwxr-xr-x 2 dh dh 120 Feb 5 21:17 . drwxr-xr-x 3 dh dh 600 Feb 5 21:17 .. -rw-r--r-- 1 dh dh 0 Feb 5 21:17 ... -rw-r--r-- 1 dh dh 0 Feb 5 21:17 a\nb\nc\b\nd -rw-r--r-- 1 dh dh 0 Feb 5 21:17 a\ b\ c dh@slarty[4]:/tmp/test/b0rken\ filenames (0) $ cd .. dh@slarty[4]:/tmp/test (0) $ IFS="`echo -e '\f'`"; for f in `find b0rken\ filenames/ -type f -printf "%p\f"`; do echo "'$f'"; done; IFS=" " 'b0rken filenames/--help' 'b0rken filenames/a b c d' 'b0rken filenames/a b c' 'b0rken filenames/...' dh@slarty[4]:/tmp/test (0) $ Wie man an den beim echo eingefuegten '' erkennt geht's sogar mit den Zeilenumbruechen (beim ls -b als \n auftauchend) und sogar mit nem Backspace *eg* (\b im ls). Pipt man das nach less, dann verschwindet auch das c... Dabei is \f (ascii 0x0c) der sog. Form Feed, man kann aber auch jedes andere Zeichen (ausser \0 (ascii 0x00)) nehmen. Wichtig ist nur, dass man nicht vergisst IFS wieder zurueckzusetzen, das Verhalten der shell wird dann _sehr_ eigentuemlich. *g* Daher am besten gleich hinter dem Befehl auf den Standardwert zuruecksetzen. wie oben: IFS="<Leerzeichen><Tab><Zeilenumbruch>" Dabei muss man in der bash den <Tab> mittels Strg+v <tab> eingeben, den Zeilenumbruch kann man, bei noch geoffneten ", direkt eingeben. Alternativ, eigentlich besser ist es, folgendes zu machen: OLDIFS="$IFS"; IFS="<was auch immer>"; Befehle; IFS="$OLDIFS" Viel Spass... Aber evtl. sollte man das auf ner extra Konsole oder xterm machen, da kann man zur Not einfach das Ding dichtmachen[1] ;) -dnh [1] auf der Konsole zur Not von ner anderen aus "killen". -- Windows verhält sich zu Betriebssystemen wie Astrologie zu Astronomie. -- am DLUG-Stammtisch
* David Haller schrieb am 05.Feb.2002:
Alternativ, eigentlich besser ist es, folgendes zu machen:
OLDIFS="$IFS"; IFS="<was auch immer>"; Befehle; IFS="$OLDIFS"
So ein Vorgehen ist immer besser, nicht nur bei IFS. Wenn man etwas den Pfad umsetzt, dann nimmt man: OLDPATH=$PATH; PATH=<was auch immer> ... PATH=$OLDPATH denn es könnte ja sein, daß der Pfad schon umgesetzt gewesen ist. Allerdings braucht man eine Variable nicht zurücksetzen, wenn das Skript so wie so zu Ende ist. Auf die aufrufende Shell hat dies, wie alle andere Variable auch, keine Auswirkung. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
Hallo, On Tue, 05 Feb 2002, Bernd Brodesser wrote:
* David Haller schrieb am 05.Feb.2002:
Alternativ, eigentlich besser ist es, folgendes zu machen:
OLDIFS="$IFS"; IFS="<was auch immer>"; Befehle; IFS="$OLDIFS"
So ein Vorgehen ist immer besser, nicht nur bei IFS. Wenn man etwas den Pfad umsetzt, dann nimmt man:
OLDPATH=$PATH; PATH=<was auch immer> ... PATH=$OLDPATH
denn es könnte ja sein, daß der Pfad schon umgesetzt gewesen ist.
Ack. In der interaktiven shell sollte man's also vorher pruefen, am besten aber gleich in einer Subshell. Also z.B: ( test -z "$OLDIFS" && { OLDIFS="$IFS"; IFS=":"; for p in $PATH; do echo "'$p'"; done; IFS="$OLDIFS" } || exit 1 ) Analog fuer andere Variablen... OLDIFS und OIFS scheinen aber meist nicht gesetzt zu sein, man muss halt vorher nachschauen, z.B. mittels set | grep 'OLDPATH'
Allerdings braucht man eine Variable nicht zurücksetzen, wenn das Skript so wie so zu Ende ist. Auf die aufrufende Shell hat dies, wie alle andere Variable auch, keine Auswirkung.
ACK :)) -dnh, der immer noch staendig neue "Tricks" und/oder "Anwendungen" der bash entdeckt :)) -- Apple's original usability studies contradicted the Xerox ones. The difference? Xerox studied people who were used to the idea of computers and user interfaces. Apple studied random lusers." -- Peter da Silva
participants (3)
-
B.Brodesser@t-online.de
-
David Haller
-
Ralph Müller