problem mit leerzeichen und dateiliste
-
Hallo,
ich habe eine liste mit dateinamen. ich wuerde die dateien aus dieser liste gerne bearbeiten koennen.
wenn ich aber z.b. "ls `cat dateiliste`" schreibe koennen viele dateien nicht angezeigt werden, weil sie leerzeichen enthalten.
Ich habe schon versucht backslashes vor jedes leerzeichen zu machen, das funktionierte aber nicht.
Wie kann ich das problem loesen?
-
was eigentlich funktionieren muesste, wenn du
die dateien in " einschliesst, also:
statt: meine datei
schreibst du: "meine datei".
leider kann ichs im moment nicht probieren :(, aber ich
denke es muesste gehen.
-
Eine Lösung wäre auch sowas:
ls "`cat dateiliste`"
[ Dieser Beitrag wurde am 16.04.2003 um 18:53 Uhr von nman editiert. ]
-
ls bekommt dort 1 Argument, das aus dem gesamten Inhalt der Datei besteht; dann wird mit einer hohen Wahrscheinlichkeit etwas wie 'file not found' ausgegeben.
Wenn die Dateien von spitzenbleistift keine Zeilenumbrücke enthält, dann könnte man einfach
eval `echo -n "ls " ;sed 's/\(.*\)/"\1"/' dateiliste`
schreiben, wenn man nur einen ls-Aufruf haben will.
-
Ach Mist, ich weiß nicht wie oft ich jetzt schon sowas in der Art gepostet habe!
-
@Daniel E.:
danke, das funktioniert fuer die datei.leider kann ich jedoch nicht (wie ich das will) mit einer for schleife durch die dateinamen iterieren:
$ for x in `echo "1 2" "3" "4 5"`; do echo $x; done; 1 2 3 4 5 $
Wie kann ich im obigen beispiel die gewuenschte ausgabe(1 2\n3\4 5) erreichen?
-
lass das echo und die ' weg, dann geht s.
eine andere methode um die dateien eines ordners durch zugehen ist folgende_
for entry in /ordner/*; do
xyz
donestatt /ordner/* können auch komplexere regex verwendet werden.
-
Entweder benutzt du statt for eine while Schleife:
echo -e "1 2\n3\n4 5\n" | while read a;do echo $a;done
1 2
3
4 5
Das echo entspricht dem Output von cat. Hierbei wird das echo a in einer Subshell ausgeführt! b=0;echo -e "1 2\\n3\\n4 5\\n" | while read a;do b=a;done;echo "b=$b"
b=0
Nicht b=4 5!!Oder du änderst IFS auf den Zeilenumbruch:
oldifs=$IFS;IFS="\n";for x in `echo -e "1 2\n3\n4 5\n"`; do echo oldifs
1 2
3
4 5IFS wird von oft benutzt! Wenn in deiner Schleife viel gemacht wird solltest du
oldifs=IFS;IFS="\\n";for x in \`echo -e "1 2\\n3\\n4 5\\n"\`; do IFS=oldifs;echo x;IFS="\\n";done; IFS=oldifs
verwenden!Wollte erst das IFS="\n" aus der Schleife rausnehmen, aber das wird doch gebraucht!
[ Dieser Beitrag wurde am 23.04.2003 um 15:27 Uhr von Peanut editiert. ]
-
hey, vielen dank Peanut.
@linux user: dein beispiel funktioniert bei dateinamen mit leerzeichen nicht.
-
cd ~
mkdir bla
touch bla "bla 1" "bla 2" "bla 3" "bla 4"
for file in /~/bla/*; do echo $file; donezeigt bei mir
/~/bla/bla
/~/bla/bla 1
/~/bla/bla 2
/~/bla/bla 3
/~/bla/bla 4
an.tut mir leid, aber das funktioniert.
-
dein beispiel ist fehlerhaft,
aber du hast recht. (sorry)1. for file in *; do echo $file; done
2. for file in `ls *`; do echo $file; done1. spaltet die dateinamen nicht auf. 2. tut es.
das ist uebrigens das "ergebnis":
$ cat wma2mp3 #!/bin/sh for file in *.wma do # echo $file mplayer "$file" -ao pcm -vc null -vo null lame --r3mix audiodump.wav "`basename "$file" .wma`.mp3" && rm audiodump.wav done $
-
was ist an meinem beispiel fehlerhaft?
-
Original erstellt von <linux user>:
was ist an meinem beispiel fehlerhaft?also wenn ich das so in ein xterm paste, laeufts nicht.
so gehts:cd ~
mkdir bla
cd bla
touch "bla 1" "bla 2" "bla 3" "bla 4"
for file in ~/bla/*; do echo $file; done