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?
Réponses:
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,
dirlink
signifie le lien symbolique, maisdirlink/
signifie le répertoire vers lequel le lien symbolique pointe.rm
ne supprimera pas un répertoire à moins que vous ne le disiezrm -r
, maisrm
sans options supprimera avec plaisir un lien symbolique.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.
et cela fonctionne toujours pour les répertoires réguliers:
Un autre exemple est la
find
commande. Sipath
vous 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.(certaines versions de find ont une option
-follow
ou-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.En d'autres termes:
rsync dir dir.bak
des copiesdir
dansdir.bak
, faire à l'dir
intérieurdir.bak
rsync dir/ dir.bak
copie tout le contenu dedir
, sans fairedir
dedansdir.bak
la source
Comme jsalonen l'a déjà dit, ces commandes ont en effet des résultats identiques si
foo
etbar
sont, en fait, des répertoires.Cependant, si
foo
etbar
ne 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 sifoo
etbar
sont des fichiers (bar
seraient é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
foo
ou desbar
ré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
).la source