Probleme mit for-Schleife und langen Dateinamen
Hallo ich wollte mittels For-Schleife aus einer Liste einzelne Dateien löschen. Die Liste sieht folgendermassen aus: liste: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls wenn ich nun mittels for-Schleife: fortest: # for in in `cat liste` # do # echo $i # done die Dateien löschen möchte, hat die For-Schleife ein Problem mit Dateien, die Leerzeichen enthalten. Die Ausgabe sieht dann folgendermassen aus: output: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls Wie kann ich der For-Schleife beibringen, dass sie Leerzeichen nicht als neue Zeile interpretiert ? -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
On Wednesday 17 September 2003 10:18, Jens Strohschnitter wrote:
Hallo
ich wollte mittels For-Schleife aus einer Liste einzelne Dateien löschen. Die Liste sieht folgendermassen aus:
liste: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls
wenn ich nun mittels for-Schleife:
fortest: # for in in `cat liste` # do # echo $i # done
while read file do echo "$file" done < liste Und nicht vergessen: Immer $file in doppelte Hochkommas setzen, damit nicht falsch interpretiert wird. (Vorraussetzung ist natürlich, das ausser Leerzeichen keine weiteren Schweinereien im Dateinamen sind) Andreas
Hi On Wednesday 17 September 2003 10:26, Andreas Kyek wrote:
while read file do echo "$file" done < liste
Und nicht vergessen: Immer $file in doppelte Hochkommas setzen, damit nicht falsch interpretiert wird. (Vorraussetzung ist natürlich, das ausser Leerzeichen keine weiteren Schweinereien im Dateinamen sind)
Nur mal interessehalber. Was für Schweinkram soll denn das sein? Ich habe das mal mit verschieden Kombinationen von Leerzeichen, Semikolon, Anführungszeihen oder Variablennamen mit und ohne $ vorweg probiert-- und nix. Kommt immer sauber an. mfg Axel
On Wednesday 17 September 2003 10:58, Axel Heinrici wrote:
Hi
On Wednesday 17 September 2003 10:26, Andreas Kyek wrote:
while read file do echo "$file" done < liste
Und nicht vergessen: Immer $file in doppelte Hochkommas setzen, damit nicht falsch interpretiert wird. (Vorraussetzung ist natürlich, das ausser Leerzeichen keine weiteren Schweinereien im Dateinamen sind)
Nur mal interessehalber. Was für Schweinkram soll denn das sein? Ich habe das mal mit verschieden Kombinationen von Leerzeichen, Semikolon, Anführungszeihen oder Variablennamen mit und ohne $ vorweg probiert-- und nix. Kommt immer sauber an.
Bei 'ner reinen Ausgabe mit echo - ja bei 'nem echten Befehl: NEIN Beispiel: Zeile enthält "*": "/server/home/musterma/.Papierkorb/musterma/JAHR_ZUL*_txt" Was macht echo? Richtig. Gibt den String aus. Was macht z.B. rm $file? Ueberleg mal. Hier kommt noch mal 'ne shell ins Spiel (anderes Beispiel: Ein "$" im Namen, usw.) Andreas
Hi On Wednesday 17 September 2003 12:14, Andreas Kyek wrote:
Nur mal interessehalber. Was für Schweinkram soll denn das sein? Ich habe das mal mit verschieden Kombinationen von Leerzeichen, Semikolon, Anführungszeihen oder Variablennamen mit und ohne $ vorweg probiert-- und nix. Kommt immer sauber an.
Bei 'ner reinen Ausgabe mit echo - ja bei 'nem echten Befehl: NEIN
Beispiel:
Zeile enthält "*":
"/server/home/musterma/.Papierkorb/musterma/JAHR_ZUL*_txt"
Was macht echo? Richtig. Gibt den String aus.
Was macht z.B. rm $file? Ueberleg mal. Hier kommt noch mal 'ne shell ins Spiel (anderes Beispiel: Ein "$" im Namen, usw.)
Hmm....
Ist mir nach wie vor unklar. Ein rm "$file" löscht nur das was er soll,
da wird nix expandiert. Du meintest doch, dass einem die
Anführungszeichen bei "$file" nur bei Leerzeichen in der Variable file
helfen, es aber sonst zu Problemen führen kann.
Das skript sieht so aus:
<======
#!/bin/bash
anders="sollnicht"
while read file
do rm "$file"
done
Hallo, Am Wed, 17 Sep 2003, Axel Heinrici schrieb:
On Wednesday 17 September 2003 12:14, Andreas Kyek wrote:
Nur mal interessehalber. Was für Schweinkram soll denn das sein?
Zum Beispiel Zeilenumbrueche... Da faellt die Loesung mit Zeilenweise in einer Liste sowieso auf die Schnauze. Deshalb verwendet man in so einem Fall auch '\0' als Trennzeichen. Wie generierst du die Liste denn? -dnh -- [...] Natuerlich aus LaTeX. Alle richtigen Maenner verwenden LaTeX. Peter 'g' Bouillon in <6apv1b$jga@hades.rz.uni-sb.de>
Hi On Wednesday 17 September 2003 15:21, David Haller wrote:
Zum Beispiel Zeilenumbrueche...
Da faellt die Loesung mit Zeilenweise in einer Liste sowieso auf die Schnauze. Deshalb verwendet man in so einem Fall auch '\0' als Trennzeichen. Wie generierst du die Liste denn?
Ok. Das geht dann wirklich schief. Ich wußte bisher nicht einmal, dass man Zeilenumbrüche in Dateinamen haben kann. Es ging mir eigentlich nur um das Beispiel von Andreas am Anfang (der 4-Zeiler in der mail vom 17. um 10:26). Ich konnte egal ob mit echo oder mit rm keine Kombination von Sonderzeichen wie " ; : $ * audenken bei der der rm nicht nur genau das gelöscht hat bzw. echo genau das ausgibt was in der Liste steht. Den Fall mit dem Zeilenumbruch habe ich dabei allerdings nicht bedacht. Dabei ist der Fehler dann allerdings schon beim "read" und nicht bei einer möglichen shell-Expandierung innerhalb der while-Schleife. Wie dem auch sei.... Da ich schon öfters Schwierigkeiten damit hatte, daß die Shell zu viel oder zu wenig expandiert/ersetzt, wollte ich eigentlich nur wissen was für eine Kombination von Sonder- und Leerzeichen dazu führt, daß bei dem echo oder rm etwas anders ankommt als das, was in der Variable file steht. Außer der Geschichte mit dem Zeilenumbruch, wo in der Variable file nichtmal das landet was da rein soll, dachte ich eigentlich, dass ein rm "$file" nur die Datei löscht die so heißt, wie in file beschrieben. Ist das denn nun richtig oder gibt es doch eine Möglichkeit, die ich leider noch nicht kenne, bei der noch irgendwas ersetzt/expandiert wird? mfg Axel
On Thursday 18 September 2003 11:51, Axel Heinrici wrote:
Hi
On Wednesday 17 September 2003 15:21, David Haller wrote:
Zum Beispiel Zeilenumbrueche...
Da faellt die Loesung mit Zeilenweise in einer Liste sowieso auf die Schnauze. Deshalb verwendet man in so einem Fall auch '\0' als Trennzeichen. Wie generierst du die Liste denn?
Ok. Das geht dann wirklich schief. Ich wußte bisher nicht einmal, dass man Zeilenumbrüche in Dateinamen haben kann.
Da Du woh partou nicht aufgibst: was passiert bei: touch 'part1"part2'? Und wie äussert sich das wohl im Skript? Andreas
On Thursday 18 September 2003 12:17, Andreas Kyek wrote:
On Thursday 18 September 2003 11:51, Axel Heinrici wrote:
Hi
On Wednesday 17 September 2003 15:21, David Haller wrote:
Zum Beispiel Zeilenumbrueche...
Da faellt die Loesung mit Zeilenweise in einer Liste sowieso auf die Schnauze. Deshalb verwendet man in so einem Fall auch '\0' als Trennzeichen. Wie generierst du die Liste denn?
Ok. Das geht dann wirklich schief. Ich wußte bisher nicht einmal, dass man Zeilenumbrüche in Dateinamen haben kann.
Da Du woh partou nicht aufgibst:
was passiert bei:
touch 'part1"part2'?
Und wie äussert sich das wohl im Skript?
Andreas
OK, man muss doch weiter ausholen (ich habe die Mail abgeschickt ohne die Erklärungen, die in meinem Kopf rumsausen, auch rauszulassen: ein " macht evtl. Schwierigkeiten, wenn der Ausdruck z.B. mit eval weiter "ausgewertet" werden muss. Das muss man aber wohl explizit erzwingen. Ansonsten fällt mir als exaktes Beispiel nur ein: Eine Datei mit "-" am Anfang. Das geht mit und ohne Anführungszeichen nicht. Andreas
Am Donnerstag, 18. September 2003 12:28 schrieb Andreas Kyek:
Ansonsten fällt mir als exaktes Beispiel nur ein: Eine Datei mit "-" am Anfang. Das geht mit und ohne Anführungszeichen nicht.
Die meisten Kommandos unterstützen die Option --, die zeigt an, dass jetzt keine Optionen mehr kommen sondern nur noch Dateinamen. Jan
* Axel Heinrici schrieb am 18.Sep.2003:
Ok. Das geht dann wirklich schief. Ich wußte bisher nicht einmal, dass man Zeilenumbrüche in Dateinamen haben kann.
In Dateinamen kann alles stehen, mit Ausnahme von \0 und / Bernd -- Bitte die Etikette beachten: http://www.suse-etikette.de.vu/etikette.html Bitte Realnamen angeben, kein Vollquoting, kein Html, PGP oder Visitenkarten benutzen. Signatur mit "-- " abtrennen, bei Antworten "Re: " voranstellen, sonst nichts. |Zufallssignatur 4
ich wollte mittels For-Schleife aus einer Liste einzelne Dateien löschen. Die Liste sieht folgendermassen aus:
liste: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls
wenn ich nun mittels for-Schleife:
fortest: # for in in `cat liste` # do # echo $i # done
while read file do echo "$file" done < liste
Und nicht vergessen: Immer $file in doppelte Hochkommas setzen, damit nicht falsch interpretiert wird. (Vorraussetzung ist natürlich, das ausser Leerzeichen keine weiteren Schweinereien im Dateinamen sind)
Perfekt! Warum das nun mit der for-Schleife nicht geht weiss ich nicht. Hm, aber was solls. Danke nochmal. -- Regards, Jens Strohschnitter ------------------------------------- *!!!LINUX LINUX LINUX LINUX LINUX!!!* * http://www.jens-strohschnitter.de * ------------------------------------- Set the controls for the heart of the sun -------------------------------------
Hallo cat Liste.txt | xargs -i ls {} -l listet diejenigen Dateien im "-l" langen Format auf, die in der Datei Liste.txt stehen. Und zwar Zeile für Zeile mit Leerzeichen, etc. In Deinem Fall wäre es also cat liste | xargs -i rm {} zum Löschen. HTH, Björn Am Mittwoch, 17. September 2003 10:18 schrieb Jens Strohschnitter:
Hallo
ich wollte mittels For-Schleife aus einer Liste einzelne Dateien löschen. Die Liste sieht folgendermassen aus:
liste: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls
wenn ich nun mittels for-Schleife:
fortest: # for in in `cat liste` # do # echo $i # done
die Dateien löschen möchte, hat die For-Schleife ein Problem mit Dateien, die Leerzeichen enthalten. Die Ausgabe sieht dann folgendermassen aus:
output: /server/home/mrfoo/.Papierkorb/mrfoo/rwztel.xls /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL.XLS /server/home/musterma/.Papierkorb/musterma/JAHR_ZUL Dateien 2.XLS /server/home/musterma/.Papierkorb/musterma/rwztel.xls
Wie kann ich der For-Schleife beibringen, dass sie Leerzeichen nicht als neue Zeile interpretiert ?
-- Regards,
Jens Strohschnitter
participants (7)
-
Andreas Kyek
-
Axel Heinrici
-
B.Brodesser@t-online.de
-
Björn Runden
-
David Haller
-
Jan.Trippler@t-online.de
-
Jens Strohschnitter