web-dev-qa-db-fra.com

Quand dois-je utiliser une barre oblique de fin sur un répertoire?

Duplicata possible:
Comment Linux gère les séparateurs de chemins multiples (/ home //// nom d'utilisateur /// fichier)

La plupart des commandes que j'utilise sous Linux se comportent exactement de la même manière si j'inclus la barre oblique de fin / caractère à la fin d'un nom de répertoire ou non.

Par exemple:

ls /home/cklein
ls /home/cklein/

cp foo bar
cp foo/ bar/

Quand cette barre oblique de fin est-elle importante? Quelle est la signification sémantique de la barre oblique finale?

61
Cory Klein

Un bon exemple est de déplacer un fichier dans un répertoire:

mv some_file foo

vs.

mv some_file foo/

Si foo n'existe pas, le premier renommera some_file En foo, plutôt que le foo/some_file Voulu; le second se plaindra, c'est ce que vous voulez.

Si foo existe mais n'est pas un répertoire, le premier peut assommer le fichier foo; encore une fois, le second se plaindra.

cp présente des problèmes similaires.

En travaillant sur certaines anciennes versions de SunOS, j'ai développé l'habitude d'ajouter /., Car le système ignorait en fait un / De fin sur un nom de fichier; par exemple, /etc/motd/ ferait référence au fichier plutôt que d'être une erreur. Les versions ultérieures de SunOS/Solaris ne semblent pas avoir ce problème.

48
Keith Thompson

C'est complètement dépendant de l'outil. rm ne vous permettra pas de supprimer un lien symbolique vers un répertoire s'il y a une barre oblique à la fin, et rsync fait des choses différentes si la spécification du fichier source a une barre oblique à la fin.

37

foo/ est comme foo/., donc si foo est un lien symbolique vers un répertoire, foo/ est un répertoire (pas un lien symbolique), et si foo n'est pas un répertoire ou un lien symbolique vers un répertoire, vous obtenez une erreur ENOTDIR pour tout ce qui tente d'accéder à foo/. C'est le comportement sous Linux.

Le comportement peut différer sur d'autres systèmes.

Voir ici et ici et ici pour voir ce que POSIX/SUS a à dire à ce sujet.

16
Stéphane Chazelas

Dans rsync, la page de manuel se lit comme suit:

   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

La barre oblique de fin sur destination n'a pas d'importance du tout. Uniquement sur la source. (Et puis, bien sûr, cela n'a d'importance que si la source est un répertoire plutôt qu'un seul fichier ou un glob.)

Pour illustrer le cas d'utilisation répertoire à répertoire:

$ 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