* Christian Andretzky wrote on Mon, Jan 23, 2006 at 13:50 +0100: [...]
das Verhalten von Linux, daß eine Datei aus zwei Namen "doppelt" ausgeführt wird ist korrekt. Man kann aber sehr wohl einer Datei mehrere Einzelbegriffen zuordnen.
Es gibt kein deartiges Verhalten und es ist nicht korrekt. Und es geht hier sowieso nicht um Linux, sondern um eine Shell. Es ist eine übliche Methode von Shells, whitespace als Trenner zu verwenden. Ausgeführt wird dabei aber nichts (wenn man über die entsprechenden Funktionen wie execve einen Pfad mit Leerzeichen und Zeilenvorschüben angibt, wird die Datei gestartet).
Schreibe statt "Meine Daten" - korrekt "Meine_Daten" und schon ist das Problem gelöst.
Warum ist das korrekt? Auf meinen Windowsmaschinen gibt es immer irgendwo ein "Meine <irgendwas>", z.B. "Dateien" oder "Bilder" - mit Leerzeichen. Wenn man viel mit Shells arbeitet, vermeidet man natürlich Leerzeichen gern, um sich Arbeit und Ärger zu sparen. Manche (wie z.B. ich) mögen Leerzeichen gar nicht, aber auch andere Sonderzeichen (Umlaute, Zeilenvorschübe) nicht. Da "Eigene Dateien" meiner Meinung nach eh Quatsch ist, macht das aber nix :-) Auch Gross- und Kleinschreibung ist so ein Thema: grundsätzlich nenne ich erstmal alles klein, es sei denn, ich möchte etwas bei der Completion bevorzugen und dann nehme ich ausnahmsweise einen Grossbuchstaben vorn.
Das hängt vom Inhalt der shell-Variablem IFS (Internal Field Separator) ab, Das is eine Zeichenkette, die enthält normalerweise Leerzeichen, Tabulator und Newline. Folgerichtig wird das Leerzeichen dan als Trennzeichen interpretiert mit dem bekannten Ergebnis.
Um das zu lösen macht man sinnvollerweise Folgendes:
OldIFS=$IFS # erstmal sichern IFS=' '
Das verschiebt das Problem auf Zeilenvorschübe in Dateinamen, oder? Kleiner Umbruchfehler in einem Script, und schon hat man so eine Datei. Oder man aus Versehen das zweite Singlequote vergessen, Enter gedrückt und als "nichts passiert ist", dann das zweite Singlequote geschrieben und nochmal Enter gedrückt: $ touch 'ein test' $ mv 'ein test' 'C:\noch ein test ' Das erzeugt einen Zeilenvorschub im Dateinamen. Die Datei heisst dann übrigens "C:\noch ein test?", wobei das ? für einen Zeilenvorschub steht. ":" und "\" sind erlaubte Zeichen in Dateinamen. Am besten quotet man einfach korrekt, dann funktioniert es immer (auch mit Zeilenvorschüben und Leerzeichen im Pfad).
fahre meine Netzwerk-Backups über "rsync". Leider gibt es dabei ein kleines Problem. Sobald im Sicherungspfad ein Verzeichnisname auftaucht, der mindestens aus zwei Worten besteht (getrennt durch Leerzeichen) behandelt rsync jedes Wort als getrenntes Verzeichnis.
Bsp.: Verzeichnisname = "Meine Daten" => "rsync" interpretiert Verzeichnis 1 = "Meine", Verzeichnis 2 = "Daten"
Das ist falsch beschrieben, rsync macht alles richtig: $ cd /tmp/ $ mkdir t $ cd /tmp/t $ mkdir -p "a/Eigene Dateien" b $ rsync -av a/ b/ building file list ... done ./ Eigene Dateien/ wrote 60 bytes read 20 bytes 160.00 bytes/sec total size is 0 speedup is 0.00 $ link:/tmp/t # ls a b a: . .. Eigene Dateien b: . .. Eigene Dateien Man sieht, "b/Eigene Dateien" wurde natürlich korrekt synchronisiert; rsync funktioniert natürlich einfach. Auch $ mkdir -p a/Eigene Dateien b funktioniert, es legt "a/Eigene", "Dateien" und "b" an. Die Shell kann ja auch nicht wissen, dass "a/Eigene Dateien" zusammengehört, "b" aber nicht mehr. Das muss man der Shell dann einfach sagen, beispielsweise durch double-quotes " (hier sogar besser mit single-quotes ') oder in dem man das Leerzeichen "escapt": $ mkdir -p a/Eigene\ Dateien b (das macht i.d.R. die Completion-Funktion so) oki, Steffen -- Dieses Schreiben wurde maschinell erstellt, es trägt daher weder Unterschrift noch Siegel.