Hallo Liste, ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte: Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich: ./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar (Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden. Baue ich das ganze in ein Skript: for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done geht das schief? Meine Frage: 1) Warum geht es schief? 2) Wie mache ich das besser? Danke schon mal für die Tipps. Wolfgang E.
Wolfgang Erlenkötter schrieb:
Hallo Liste,
ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte:
Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich:
./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
(Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden.
Baue ich das ganze in ein Skript:
for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
geht das schief?
Meine Frage: 1) Warum geht es schief? 2) Wie mache ich das besser?
Danke schon mal für die Tipps.
Tja, Kristallkugel hab ich keine, was geht schief? Obiger Code läuft bei mir sowohl als Script wie auf der Commandozeile. so long... bernd
Hallo Am Samstag, 28. Juni 2003 15:44 schrieb Bernd Obermayr:
Wolfgang Erlenkötter schrieb:
Hallo Liste,
ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte:
Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich:
./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
(Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden.
Baue ich das ganze in ein Skript:
for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
geht das schief?
Meine Frage: 1) Warum geht es schief? 2) Wie mache ich das besser?
Danke schon mal für die Tipps.
Tja, Kristallkugel hab ich keine, was geht schief? Obiger Code läuft bei mir sowohl als Script wie auf der Commandozeile.
Mit dem gleichen Ergebnis? Also. Hier die unterschiedlichen Ausgaben: wolfgang@pio:~/leer> find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' ./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar und: ./ott.sh (so heißt das Skript) File: ./KARL -> OK File: ./find -> OK File: ./karl -> OK File: ./paul -> OK File: ./ott.sh -> OK File: ./Diese -> ERROR File: Datei -> ERROR File: ./teste.tar -> OK Im zweiten Beispiel wird die Leerstelle als Trennzeichen benutzt! Gruß Wolfgang
Wolfgang Erlenkötter schrieb: [...]
Im zweiten Beispiel wird die Leerstelle als Trennzeichen benutzt!
Gruß Wolfgang
Aaaah.. jetzt wirds klarer ;) -------8<-------- oifs=$IFS IFS=" " for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done IFS=$oifs exit --------8<-------- Aus man bash: IFS The Internal Field Separator that is used for word splitting after expansion and to split lines into words with the read builtin command. The default value is ``<space><tab><newline>''. IFS wird also nur mit dem Newline besetzt, so wird "Diese Datei" dann als _ein_ Wort erkannt. so long... bernd
* Bernd Obermayr schrieb am 28.Jun.2003:
done IFS=$oifs exit
Du brauchst aber IFS nicht neu zu setzen, wenn Du das Programm ohnehin verläßt. Bernd -- Alle meine Signaturen sind rein zufällig und haben nichts mit dem Text oder dem Schreiber zu tun, dem ich antworte. Falls irgendwelche Unrichtigkeiten dabei sein sollten, so bedauere ich das. Es wäre nett, wenn Du mich benachrichtigen würdest. |Zufallssignatur 0
Am Sam, 2003-06-28 um 16.01 schrieb Wolfgang Erlenkötter :
Hallo
Wolfgang Erlenkötter schrieb:
Hallo Liste,
ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte:
Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich:
./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
(Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden.
Baue ich das ganze in ein Skript:
for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do
Der Teil zwischen den '`' wird ersetzt durch einen String "... ./otto.sh ./Diese Datei ./teste.tar" . Der Backslash verschwindet irgendwo zwischen dem find und Deinem Script, da hier eine Shell-Schnittstelle liegt. Problem mit sub-shell, genau das, was ich an bash so hasse.
echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
geht das schief?
Meine Frage: 1) Warum geht es schief? 2) Wie mache ich das besser?
Also. Hier die unterschiedlichen Ausgaben: wolfgang@pio:~/leer> find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' ./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
und:
./ott.sh (so heißt das Skript) File: ./KARL -> OK File: ./find -> OK File: ./karl -> OK File: ./paul -> OK File: ./ott.sh -> OK File: ./Diese -> ERROR File: Datei -> ERROR File: ./teste.tar -> OK
Im zweiten Beispiel wird die Leerstelle als Trennzeichen benutzt!
Abhilfe AFAIK: 1. find ein \0 an die Dateinamen anhängen lassen (man find); oder: 2. Die Auswertung (echo, if ....fi) in ein extra-Script einbauen und im find-Befehl die Option -exec benutzen. Man könnte im Prinzip auch eine bash-function benutzen, aber ich glaube nicht, dass das über den find-befehl geht. HTH, Wolfgang
On Sam, 28 Jun 2003 at 16:58 (+0200), Wolfgang Hinsch wrote: [...]
Abhilfe AFAIK: 1. find ein \0 an die Dateinamen anhängen lassen (man find); oder: 2. Die Auswertung (echo, if ....fi) in ein extra-Script einbauen und im find-Befehl die Option -exec benutzen. Man könnte im Prinzip auch eine bash-function benutzen, aber ich glaube nicht, dass das über den find-befehl geht.
Wie wäre es mit (alles in eine Zeile): find . -type f -maxdepth 1 -printf "echo -n \"File: %p -> \"; if [ -e \"%p\" ]; then echo -e \"\033[32mOK\033[m\"; else echo -e \"\033[31mERROR\033[m\"; fi\n" | sh - Der printf erzeugt quasi das Bash-Script und sh - fürht es aus. Nicht sehr umweltfreundlich, da für jede Datei eine neue Shell gestartet wird, aber Shell ;-) Jan
Hallo, On Sat, 28 Jun 2003, Wolfgang Erlenkötter schrieb:
./ott.sh (so heißt das Skript) [..] File: ./ott.sh -> OK File: ./Diese -> ERROR File: Datei -> ERROR File: ./teste.tar -> OK
Im zweiten Beispiel wird die Leerstelle als Trennzeichen benutzt!
Folgendes sollte funktionieren find . -type f -maxdepth 1 -print | while read FILE do if test -e "$FILE" then [..] fi done -dnh --
/ "And believe me, Oracle on Linux is so bleeding edge \ [ you have to drill drainage holes in whatever box you ] \ inflict^H^H^H^H^Hstall it on." -- Chris Klein / I said that? That's pretty funny. -- in asr
On Sam, 28 Jun 2003 at 14:25 (+0200), Wolfgang Erlenkötter wrote:
ich teste gerade ein Skript und verstehe nicht, warum es nicht so funktioniert, wie es sollte:
Mit find . -type f -maxdepth 1 -print|sed 's/ /\\ /g' auf der Kommandozeile erhalte ich:
./KARL ./karl ./paul ./ott.sh ./Diese\ Datei ./teste.tar
(Die Dateien im aktuellen Verzeichnis) Das heißt, die Leerstelle in dem Dateinamen Diese Datei soll geschützt werden.
Baue ich das ganze in ein Skript:
for FILE in `find . -type f -maxdepth 1 -print|sed 's/ /\\ /g'`; do echo -n "File: $FILE -> " if [ -e $FILE ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
find . -type f -maxdepth 1 -print | while read FILE; do echo -n "File: $FILE -> " if [ -e "$FILE" ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done Außerdem solltest Du Dir mal die Option -print0 des find in Verbindung mit der Option -0 von xargs näher anschauen. BTW: Was bezweckst Du mit dem Konstukt? find liefert _existierende_ Dateien, die Du anschließend auf Existenz überprüfst? IMHO doppelt gemoppelt. Jan
Hallo, Am Samstag, 28. Juni 2003 20:18 schrieb Jan Trippler:
find . -type f -maxdepth 1 -print | while read FILE; do echo -n "File: $FILE -> " if [ -e "$FILE" ]; then echo -e "\033[32mOK\033[m" else echo -e "\033[31mERROR\033[m" fi done
Außerdem solltest Du Dir mal die Option -print0 des find in Verbindung mit der Option -0 von xargs näher anschauen.
BTW: Was bezweckst Du mit dem Konstukt? find liefert _existierende_ Dateien, die Du anschließend auf Existenz überprüfst? IMHO doppelt gemoppelt.
Gut aufgepasst. Das ist nur ein Lern-Beispiel. Ich suche gute Beispiele für meine Linux-Kurse. Außerdem hat es ganz gut gezeigt, wie _ungünstig_ es ist, Leerzeichen in Dateinamen zu benutzen. Das Skript ist die verkürzte Version von einem Skript, dass alle Dateinamen mit Großbuchstaben in Dateinamen mit Kleinbuchstaben "ändert", im Sinne von umbenennt. Da wird irgendwann auf Existenz überprüft. Damit es einfacher wird, ist das hier alles gekürzt. Grüße Wolfgang
Hallo, On Sat, 28 Jun 2003, Wolfgang Erlenkötter schrieb:
Das Skript ist die verkürzte Version von einem Skript, dass alle Dateinamen mit Großbuchstaben in Dateinamen mit Kleinbuchstaben "ändert", im Sinne von umbenennt. Da wird irgendwann auf Existenz überprüft.
Du willst 'mmv "*" "#l1"' per shell reimplementieren? -dnh -- 35: Hacker Randal Schwartz (nach Intel)
Hallo, Am Samstag, 28. Juni 2003 22:42 schrieb David Haller:
Hallo,
On Sat, 28 Jun 2003, Wolfgang Erlenkötter schrieb:
Das Skript ist die verkürzte Version von einem Skript, dass alle Dateinamen mit Großbuchstaben in Dateinamen mit Kleinbuchstaben "ändert", im Sinne von umbenennt. Da wird irgendwann auf Existenz überprüft.
Du willst 'mmv "*" "#l1"' per shell reimplementieren?
Nein. Es geht nicht um eine Reimplementierung. Es geht um ein Übungsbeispiel für Programmstrukturen und der Shell. Dass da jetzt noch ein Programm existiert, das das auch macht, war mir schlicht und ergreifend nicht bewusst. Man lernt nie aus. Danke für den Hinweis! Wolfgang E.
On Sam, 28 Jun 2003 at 21:27 (+0200), Wolfgang Erlenkötter wrote:
Am Samstag, 28. Juni 2003 20:18 schrieb Jan Trippler: [...]
BTW: Was bezweckst Du mit dem Konstukt? find liefert _existierende_ Dateien, die Du anschließend auf Existenz überprüfst? IMHO doppelt gemoppelt.
Gut aufgepasst. Das ist nur ein Lern-Beispiel. Ich suche gute Beispiele für meine Linux-Kurse. Außerdem hat es ganz gut gezeigt, wie _ungünstig_ es ist, Leerzeichen in Dateinamen zu benutzen.
Das ist Ansichtssache. Ich persönlich halte Leerzeichen in Dateinamen mittlerweile für normal (es gibt ja auch keinen triftigen Grund, sie nicht zu verwenden) und stelle mich (meist ;-) darauf ein. Krank finde ich nach wie vor den \n - aber auch das ist IMHO und es gibt Mittel zur Behandlung ;-) Jan
participants (6)
-
B.Brodesser@t-online.de
-
David Haller
-
Illuminatus@t-online.de
-
Jan.Trippler@t-online.de
-
Wolfgang Erlenkötter
-
Wolfgang Hinsch