Unix: Schrägstrich nach Verzeichnisnamen oder nicht

13

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?

Svish
quelle
2
Es ist wahr für Rsync. Es startet das Kopieren entweder mit dem Verzeichnis selbst oder mit den Elementen darunter, je nachdem, ob Sie den abschließenden Schrägstrich überspringen oder hinzufügen.
Maxelost
@maxelost: Könnten Sie eine Antwort mit einigen Beispielen hinzufügen, damit klar ist, welche Funktion was hat?
2.
Mikel hat es ganz klar beantwortet, denke ich.
Maxelost

Antworten:

17

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 dirlinkder Symlink, aberdirlink/ das Verzeichnis, auf das der Symlink verweist. rmentfernt kein Verzeichnis, es sei denn, Sie sagen rm -r, aber rmohne Optionen wird ein Symlink gerne entfernt.

$ mkdir dir
$ ln -s dir dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir
lrwxrwxrwx 1 mikel mikel    3 2011-02-02 22:26 dirlink -> dir
$ rm dirlink/
rm: cannot remove `dirlink/': Is a directory
$ rm dirlink
$ ls -l
total 4
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:26 dir

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.

$ ls -ld dirlink
lrwxrwxrwx 1 mikel mikel 3 2011-02-02 22:46 dirlink -> dir
$ ls -ld dirlink/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dirlink/

und es funktioniert immer noch für reguläre Verzeichnisse:

$ ls -ld dir
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir
$ ls -ld dir/
drwxr-xr-x 2 mikel mikel 4096 2011-02-02 22:46 dir/

Ein anderes Beispiel ist das find Befehl. Wenn pathes 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.

$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file

(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.

$ mkdir dir
$ touch dir/file
$ rsync -r dir dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/dir
./dir.bak/dir/file
$ rm -r dir.bak
$ rsync -r dir/ dir.bak
$ find .
.
./dir
./dir/file
./dir.bak
./dir.bak/file

Mit anderen Worten:

  • rsync dir dir.bakkopiert dirhinein dir.bak, macht dirhineindir.bak
  • rsync dir/ dir.bakkopiert alle inhalte von dir, ohne dirinnen zu machendir.bak
Mikel
quelle
2

Wie jsalonen bereits sagte, haben diese Befehle tatsächlich identische Ergebnisse, wenn foo und barsind, wie in der Tat, Verzeichnisse.

Wenn es jedoch foound barkeine 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, wenn fooundbar Dateien sind ( barwü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 erwartenfoo oder barsind 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).

Etienne Dechamps
quelle
Ja, wie ich angedeutet habe, können Befehle gut abschließende Schrägstriche verarbeiten oder auch nicht. Es ist sehr gut, dass Sie als Beispiel rsync angegeben haben!
jsalonen