¿Cuál es la diferencia entre los siguientes comandos?
mv foo bar
mv foo/ bar/
mv foo/ bar
mv foo bar/
¿O no hay diferencia? ¿O depende del comando utilizado? Piense, por ejemplo, que leí que el comportamiento de rsync cambia un poco dependiendo de la versión que use. ¿Alguien tiene una buena explicación para no tener que adivinar más y sentir que sé lo que estoy haciendo?
Respuestas:
Muchas utilidades de Unix tratan los enlaces simbólicos de manera diferente dependiendo de si hay una barra inclinada final.
Este comportamiento se describe en la documentación de POSIX Symbolic Link y también se menciona en la documentación de GNU coreutils .
Básicamente, la barra diagonal final significa seguir (o "desreferenciar") el enlace simbólico.
Por ejemplo, en el siguiente código,
dirlink
significa el enlace simbólico, perodirlink/
significa el directorio al que apunta el enlace simbólico.rm
no eliminará un directorio a menos que usted lo digarm -r
, perorm
sin opciones eliminará felizmente un enlace simbólico.También es útil para ver los permisos de un directorio, sin tener que preocuparse si el directorio es un directorio real o simplemente un enlace simbólico a un directorio.
y todavía funciona para directorios regulares:
Otro ejemplo es el
find
comando. Sipath
le pide que busque en un enlace simbólico, no seguirá el enlace simbólico por defecto, lo que significa que solo procesa el enlace simbólico. Agregar una barra inclinada final hace que trate el enlace simbólico como el directorio al que apunta el enlace.(algunas versiones de find tienen una opción
-follow
u-L
opción, pero eso hace que siga todos los enlaces simbólicos, no solo el primero)En el caso de
rsync
, si debe agregar una barra inclinada depende de si desea que el directorio que está copiando sea un subdirectorio o no.En otras palabras:
rsync dir dir.bak
copiasdir
endir.bak
, haciendodir
adentrodir.bak
rsync dir/ dir.bak
copia todo el contenido dedir
, sin hacerdir
dentrodir.bak
fuente
Como ya dijo jsalonen, estos comandos tienen resultados idénticos si
foo
ybar
son, de hecho, directorios.Sin embargo, si
foo
ybar
no son directorios, el comando fallará si agrega una barra inclinada final, y tendrá éxito si no lo hace. La cosa es que, si el comando tiene éxito, probablemente no tendrá el resultado que deseaba. De hecho, incluso podría perder datos sifoo
ybar
son archivos (bar
se sobrescribirán).Si su intención es especificar directorios y no archivos, entonces debe usar una barra diagonal final, ya que hace que el comando sea más robusto: si la expectativa de que
foo
obar
hay directorios falla, entonces el comando fallará con gracia, en lugar de tener resultados inesperados.Además, algunos comandos (raros) se comportan de manera diferente dependiendo de la presencia de una barra inclinada final, incluso con directorios (un ejemplo es
rsync
).fuente