Unix: barra diagonal después de los nombres de directorio o no

Unix: barra diagonal después de los nombres de directorio o no

¿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, dirlinksignifica el enlace simbólico, pero dirlink/significa el directorio al que apunta el enlace simbólico. rmno eliminará un directorio a menos que usted diga rm -r, pero rmsin 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 findcomando. Si pathle 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 -followo -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.bakcopias diren dir.bak, haciendo dirdentrodir.bak
  • rsync dir/ dir.bakcopia todo el contenido de dir, sin hacer dirdentrodir.bak

Respuesta2

Como ya dijo jsalonen, estos comandos de hecho tienen resultados idénticos si fooy barson, de hecho, directorios.

Sin embargo, si fooy barno 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 fooson bararchivos ( barse 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 fooo barfallan, 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).

información relacionada