¿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 que se utilice? Piense, por ejemplo, que leí que el comportamiento de rsync cambia un poco según la versión que utilice. ¿Alguien tiene una buena explicación para no tener que adivinar más y sentir que sé lo que estoy haciendo?
Respuesta1
Muchas utilidades de Unix tratan los enlaces simbólicos de manera diferente dependiendo de si hay una barra diagonal al final.
Este comportamiento se describe en elDocumentación de enlace simbólico POSIXy también se menciona en elDocumentación de GNU coreutils.
Básicamente, la barra diagonal final significa seguir (o "desreferenciar") el enlace simbólico.
Por ejemplo, en el código siguiente, dirlink
significa el enlace simbólico, pero dirlink/
significa el directorio al que apunta el enlace simbólico. rm
no eliminará un directorio a menos que usted diga rm -r
, pero rm
sin opciones eliminará felizmente un enlace simbólico.
$ 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
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.
$ 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/
y todavía funciona para directorios normales:
$ 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/
Otro ejemplo es el find
comando. Si path
le pide que busque en un enlace simbólico, no seguirá el enlace simbólico de forma predeterminada, lo que significa que solo procesa el enlace simbólico. Agregar una barra diagonal hace que trate el enlace simbólico como el directorio al que apunta el enlace.
$ find dir
dir
dir/file
$ find dirlink
dirlink
$ find dirlink/
dirlink/
dirlink/file
(algunas versiones de buscar tienen la opción -follow
o -L
, pero eso hace que siga todos los enlaces simbólicos, no solo el primero)
En el caso de rsync
, si debes agregar una barra diagonal depende de si deseas que el directorio que estás copiando sea un subdirectorio o no.
$ 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 otras palabras:
rsync dir dir.bak
copiasdir
endir.bak
, haciendodir
dentrodir.bak
rsync dir/ dir.bak
copia todo el contenido dedir
, sin hacerdir
dentrodir.bak
Respuesta2
Como ya dijo jsalonen, estos comandos de hecho tienen resultados idénticos si foo
y bar
son, de hecho, directorios.
Sin embargo, si foo
y bar
no son directorios, el comando fallará si agrega una barra al final y tendrá éxito si no lo hace. La cuestión es que, si el comando tiene éxito, probablemente no obtendrá el resultado deseado. De hecho, incluso podría perder datos si foo
son bar
archivos ( bar
se sobrescribirían).
Si su intención es especificar directorios y no archivos, entoncesdeberíause una barra diagonal, porque hace que el comando sea más sólido: si la expectativa de que los directorios foo
o bar
fallan, entonces el comando fallará correctamente, en lugar de tener resultados inesperados.
Además, algunos comandos (raros) se comportan de manera diferente dependiendo de la presencia de una barra diagonal, incluso con directorios (un ejemplo es rsync
).