Unix: barra oblicua después de nombres de directorio o no

13

¿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?

Svish
fuente
2
Es cierto para rsync. Comienza la copia con el directorio en sí o con los elementos debajo de él, dependiendo de si omite o agrega la barra diagonal, respectivamente.
maxelost
@maxelost: ¿Podría agregar una respuesta con algunos ejemplos para que quede claro qué hace qué?
Svish
Mikel respondió con bastante claridad a continuación, creo.
maxelost

Respuestas:

17

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, 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 lo 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 regulares:

$ 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 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.

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

(algunas versiones de find tienen una opción -followu -Lopció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.

$ 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 diradentrodir.bak
  • rsync dir/ dir.bakcopia todo el contenido de dir, sin hacer dirdentrodir.bak
Mikel
fuente
2

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

Sin embargo, si fooy barno 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 si fooy barson archivos ( barse 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 fooo barhay 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).

Etienne Dechamps
fuente
Sí, como implicaba, los comandos pueden o no manejar bien las barras diagonales. ¡Es muy bueno que hayas proporcionado rsync como ejemplo!
jsalonen