Unix: barre oblique après les noms de répertoire ou non

13

Quelle est la différence entre les commandes suivantes?

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

Ou n'y a-t-il aucune différence? Ou cela dépend-il de la commande utilisée? Pensez par exemple que j'ai lu que le comportement de rsync change un peu selon la version que vous utilisez. Quelqu'un a-t-il une bonne explication donc je n'ai plus à deviner et à sentir que je sais ce que je fais?

Svish
la source
2
C'est vrai pour rsync. Il démarre la copie soit avec le répertoire lui-même soit avec les éléments en dessous, selon que vous sautez ou ajoutez la barre oblique finale, respectivement.
maxelost
@maxelost: Pourriez-vous ajouter une réponse avec quelques exemples afin qu'il soit clair qui fait quoi?
Svish
Mikel y a répondu assez clairement ci-dessous, je pense.
maxelost

Réponses:

17

De nombreux utilitaires Unix traitent les liens symboliques différemment selon qu'il existe une barre oblique de fin.

Ce comportement est décrit dans la documentation POSIX Symbolic Link et est également mentionné dans la documentation GNU coreutils .

Fondamentalement, la barre oblique de fin signifie suivre (ou "déréférencer") le lien symbolique.

Par exemple, dans le code ci-dessous, dirlinksignifie le lien symbolique, mais dirlink/signifie le répertoire vers lequel le lien symbolique pointe. rmne supprimera pas un répertoire à moins que vous ne le disiez rm -r, mais rmsans options supprimera avec plaisir 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 afficher les autorisations d'un répertoire, sans avoir à se soucier si le répertoire est un vrai répertoire ou simplement 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 réguliers:

$ 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 la findcommande. Si pathvous lui demandez de rechercher est un lien symbolique, il ne suivra pas le lien symbolique par défaut, ce qui signifie qu'il ne traite que le lien symbolique. L'ajout d'une barre oblique de fin fait qu'il traite le lien symbolique comme le répertoire vers lequel pointe le lien.

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

(certaines versions de find ont une option -followou -L, mais cela le fait suivre tous les liens symboliques, pas seulement le premier)


Dans le cas de rsync, si vous devez ajouter une barre oblique dépend de si vous voulez que le répertoire que vous copiez soit un sous-répertoire ou non.

$ 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.bakdes copies dirdans dir.bak, faire à l' dirintérieurdir.bak
  • rsync dir/ dir.bakcopie tout le contenu de dir, sans faire dirdedansdir.bak
Mikel
la source
2

Comme jsalonen l'a déjà dit, ces commandes ont en effet des résultats identiques si fooet barsont, en fait, des répertoires.

Cependant, si fooet barne sont pas des répertoires, la commande échouera si vous ajoutez une barre oblique de fin et réussira si vous ne le faites pas. Le fait est que si la commande réussit, elle n'aura probablement pas le résultat souhaité. En fait, vous pourriez même perdre des données si fooet barsont des fichiers ( barseraient écrasés).

Si votre intention est de spécifier les répertoires et les fichiers, vous devez utiliser un slash, car elle rend la commande plus robuste: si l'attente fooou des barrépertoires échoue, la commande échoue avec élégance, 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, même avec des répertoires (un exemple est rsync).

Etienne Dechamps
la source
Oui, comme je l'ai laissé entendre, les commandes peuvent ou non gérer correctement les barres obliques de fin. C'est très bien que vous ayez fourni rsync comme exemple!
jsalonen