Was ist der Unterschied zwischen den folgenden Befehlen?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
Oder gibt es keinen Unterschied? Oder hängt es vom verwendeten Befehl ab? Denken Sie zum Beispiel, ich habe gelesen, dass sich das Rsync-Verhalten ein wenig ändert, je nachdem, welche Version Sie verwenden. Hat jemand eine gute Erklärung, damit ich nicht mehr raten muss und das Gefühl habe, zu wissen, was ich tue?
Antworten:
Viele Unix-Dienstprogramme behandeln Symlinks unterschiedlich, je nachdem, ob ein abschließender Schrägstrich vorliegt.
Dieses Verhalten ist in der POSIX Symbolic Link-Dokumentation beschrieben und wird auch in der GNU coreutils-Dokumentation erwähnt .
Grundsätzlich bedeutet der abschließende Schrägstrich, dem Symlink zu folgen (oder "dereferenzieren").
Zum Beispiel bedeutet im folgenden Code
dirlink
der Symlink, aberdirlink/
das Verzeichnis, auf das der Symlink verweist.rm
entfernt kein Verzeichnis, es sei denn, Sie sagenrm -r
, aberrm
ohne Optionen wird ein Symlink gerne entfernt.Es ist auch nützlich, um die Berechtigungen eines Verzeichnisses anzuzeigen, ohne sich darum kümmern zu müssen, ob es sich bei dem Verzeichnis um ein echtes Verzeichnis oder nur um einen Symlink zu einem Verzeichnis handelt.
und es funktioniert immer noch für reguläre Verzeichnisse:
Ein anderes Beispiel ist das
find
Befehl. Wennpath
es sich bei dem Link, in dem Sie suchen möchten, um einen Symlink handelt, folgt dieser standardmäßig nicht dem Symlink, dh, er verarbeitet nur den Symlink. Durch das Hinzufügen eines abschließenden Schrägstrichs wird der Symlink als das Verzeichnis behandelt, auf das der Link verweist.(Einige Versionen von find haben eine
-follow
oder-L
-Option, aber das bedeutet, dass sie allen symbolischen Links folgen, nicht nur dem ersten.)Im Fall von
rsync
, ob Sie ein Schrägstrich anhängen soll hängt davon ab , ob Sie das Verzeichnis sind Kopieren Sie ein Unterverzeichnis oder nicht zu sein.Mit anderen Worten:
rsync dir dir.bak
kopiertdir
hineindir.bak
, machtdir
hineindir.bak
rsync dir/ dir.bak
kopiert alle inhalte vondir
, ohnedir
innen zu machendir.bak
quelle
Wie jsalonen bereits sagte, haben diese Befehle tatsächlich identische Ergebnisse, wenn
foo
undbar
sind, wie in der Tat, Verzeichnisse.Wenn es jedoch
foo
undbar
keine Verzeichnisse sind, dann wird der Befehl fehlschlagen , wenn Sie einen Schrägstrich anhängen, und wird erfolgreich sein , wenn Sie dies nicht tun. Wenn der Befehl erfolgreich ausgeführt wird, hat er wahrscheinlich nicht das gewünschte Ergebnis. In der Tat könnten Sie sogar Daten verlieren, wennfoo
undbar
Dateien sind (bar
würden überschrieben).Wenn Sie Verzeichnisse und nicht Dateien angeben möchten, sollten Sie einen abschließenden Schrägstrich verwenden, da dies den Befehl robuster macht: Wenn Sie dies erwarten
foo
oderbar
sind Verzeichnisse ausfällt, dann wird der Befehl ordnungsgemäß fehlschlagen, sondern unerwartete Ergebnisse zu haben.Außerdem verhalten sich einige (seltene) Befehle abhängig vom Vorhandensein eines abschließenden Schrägstrichs auch bei Verzeichnissen unterschiedlich (ein Beispiel ist
rsync
).quelle