it-swarm.com.de

Wann sollte ich einen abschließenden Schrägstrich in einem Verzeichnis verwenden?

Mögliches Duplikat:
Wie Linux mit mehreren Pfadtrennzeichen umgeht (/ home //// Benutzername /// Datei)

Die meisten Befehle, die ich unter Linux verwende, verhalten sich genauso, unabhängig davon, ob ich den abschließenden Schrägstrich / Am Ende eines Verzeichnisnamens einfüge oder nicht.

Zum Beispiel:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

Wann ist dieser nachgestellte Schrägstrich wichtig? Was ist die semantische Bedeutung des nachgestellten Schrägstrichs?

61
Cory Klein

Ein gutes Beispiel ist das Verschieben einer Datei in ein Verzeichnis:

mv some_file foo

vs.

mv some_file foo/

Wenn foo nicht existiert, benennt der erste some_file In foo um und nicht in den beabsichtigten foo/some_file. Der zweite wird sich beschweren, was Sie wollen.

Wenn foo vorhanden ist, aber kein Verzeichnis ist, kann der erste die Datei foo blockieren. wieder wird sich der zweite beschweren.

cp weist ähnliche Probleme auf.

Bei der Arbeit an einigen alten Versionen von SunOS habe ich mir angewöhnt, /. Anzuhängen, da das System ein nachfolgendes / An einem Dateinamen ignoriert hat. Beispielsweise würde /etc/motd/ auf die Datei verweisen, anstatt ein Fehler zu sein. Spätere Versionen von SunOS/Solaris scheinen dieses Problem nicht zu haben.

48
Keith Thompson

Es ist vollständig abhängig vom Werkzeug. rm lässt Sie keinen Symlink zu einem Verzeichnis entfernen, wenn am Ende ein Schrägstrich steht, und rsync führt verschiedene Aktionen aus, wenn die Quelldateispezifikation am Ende einen Schrägstrich enthält.

foo/ Ist wie foo/.. Wenn also foo ein Symlink zu einem Verzeichnis ist, ist foo/ Ein Verzeichnis (kein Symlink) und wenn foo ist kein Verzeichnis oder Symlink zu einem Verzeichnis, dann erhalten Sie einen ENOTDIR-Fehler für alles, was versucht, auf foo/ zuzugreifen. Das ist das Verhalten unter Linux.

Das Verhalten kann auf anderen Systemen abweichen.

Siehe hier und hier und hier , um zu sehen, was POSIX/SUS dazu zu sagen haben.

16

In rsync lautet die Manpage wie folgt:

   A trailing slash on the source changes this behavior to avoid  creating
   an  additional  directory level at the destination.  You can think of a
   trailing / on a source as meaning "copy the contents of this directory"
   as  opposed  to  "copy  the  directory  by name", but in both cases the
   attributes of the containing directory are transferred to the  contain-
   ing  directory on the destination.  In other words, each of the follow-
   ing commands copies the files in the same way, including their  setting
   of the attributes of /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo

Der abschließende Schrägstrich auf dem Ziel spielt überhaupt keine Rolle. Nur an der Quelle. (Und dann ist es natürlich nur wichtig, ob die Quelle ein Verzeichnis und keine einzelne Datei oder ein Glob ist.)

Um den Anwendungsfall von Verzeichnis zu Verzeichnis zu veranschaulichen:

$ mkdir foo bar baz
$ chmod 700 foo
$ chmod 750 bar
$ chmod 705 baz
$ echo hello > foo/file1
$ chmod 606 foo/file1 
$ ls -n
total 0
drwxr-x---  2 501  20   68 Aug  8 15:29 bar/
drwx---r-x  2 501  20   68 Aug  8 15:29 baz/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n foo
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rsync -a foo bar
$ rsync -a foo baz/
$ rsync -a foo bif
$ rsync -a foo bonk/
$ ls -n
total 0
drwxr-x---  3 501  20  102 Aug  8 15:30 bar/
drwx---r-x  3 501  20  102 Aug  8 15:30 baz/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bif/
drwxr-xr-x  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

baz:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bif:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

bonk:
total 0
drwx------  3 501  20  102 Aug  8 15:30 foo/

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ rm -rf b*
$ mkdir bar baz
$ chmod 750 bar
$ chmod 705 baz
$ rsync -a foo/ bar
$ rsync -a foo/ baz/
$ rsync -a foo/ bif
$ rsync -a foo/ bonk/
$ ls -n
total 0
drwx------  3 501  20  102 Aug  8 15:30 bar/
drwx------  3 501  20  102 Aug  8 15:30 baz/
drwx------  3 501  20  102 Aug  8 15:30 bif/
drwx------  3 501  20  102 Aug  8 15:30 bonk/
drwx------  3 501  20  102 Aug  8 15:30 foo/
$ ls -n *
bar:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

baz:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bif:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

bonk:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1

foo:
total 8
-rw----rw-  1 501  20  6 Aug  8 15:30 file1
$ 
6
Wildcard