15 votes

Unix : Slash après les noms de répertoires ou pas

Quelle est la différence entre les commandes suivantes ?

mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/

Ou bien n'y a-t-il aucune différence ? Ou cela dépend-il de la commande utilisée ? Je pense par exemple avoir lu que le comportement de rsync change un peu en fonction de la version que vous utilisez. Quelqu'un a-t-il une bonne explication pour que je n'aie plus à deviner et que j'aie l'impression de savoir ce que je fais ?

21voto

Mikel Points 8576

De nombreux utilitaires Unix traitent les liens symboliques différemment selon qu'ils comportent ou non une barre oblique de fin de ligne.

Ce comportement est décrit dans le Documentation sur les liens symboliques POSIX et est également mentionné dans le Documentation de GNU coreutils .

En gros, la barre oblique de fin signifie qu'il faut suivre (ou "déréférencer") le lien symbolique.

Par exemple, dans le code ci-dessous, dirlink signifie le lien symbolique, mais dirlink/ désigne le répertoire vers lequel pointe le lien symbolique. rm ne supprimera pas un répertoire à moins que vous ne disiez rm -r mais rm sans options supprimera volontiers un lien symbolique.

$ 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

Il est également utile pour visualiser les permissions d'un répertoire, sans avoir à se soucier de savoir si le répertoire est un vrai répertoire ou juste un lien symbolique vers un répertoire.

$ 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/

et cela fonctionne toujours pour les répertoires ordinaires :

$ 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/

Un autre exemple est le find commande. Si le path dans lequel vous lui demandez de chercher est un lien symbolique, il ne suivra pas le lien symbolique par défaut, ce qui signifie qu'il ne traitera que le lien symbolique. L'ajout d'une barre oblique de fin de ligne lui permet de traiter le lien symbolique comme le répertoire vers lequel le lien pointe.

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

(certaines versions de find ont un -follow ou -L mais cela lui permet de suivre tous les liens symboliques, et pas seulement le premier.)


Dans le cas de rsync Dans le cas de la copie d'un répertoire, l'ajout d'une barre oblique dépend du fait que vous voulez ou non que le répertoire que vous copiez soit un sous-répertoire.

$ 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

En d'autres termes :

  • rsync dir dir.bak copies dir en dir.bak en faisant dir à l'intérieur de dir.bak
  • rsync dir/ dir.bak copie tout le contenu de dir sans faire dir à l'intérieur de dir.bak

2voto

Yves Junqueira Points 671

Comme jsalonen l'a déjà dit, ces commandes ont effectivement des résultats identiques si foo y bar sont, en fait, des répertoires.

Toutefois, si foo y bar ne sont pas des répertoires, la commande échouera si vous ajoutez un slash de fin de ligne, et réussira si vous ne le faites pas. Le problème est que si la commande réussit, elle n'aura probablement pas le résultat escompté. En fait, vous pourriez même perdre des données si foo y bar sont des fichiers ( bar serait écrasé).

Si votre intention est de spécifier des répertoires et non des fichiers, vous devez alors debe utiliser une barre oblique de fin, car cela rend la commande plus robuste : si l'on s'attend à ce que la commande foo ou bar sont des répertoires échoue, alors la commande échouera gracieusement, au lieu d'avoir des résultats inattendus.

De plus, certaines commandes (rares) se comportent différemment en fonction de la présence d'une barre oblique de fin de ligne, même avec les répertoires (un exemple est le suivant rsync ).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X