¿Por qué crear un enlace como este: ln -nsf?

42

¿Qué hace esto?

ln -nsf

Sé que ln -screa un enlace simbólico, no un enlace duro, lo que significa que puede eliminarlo y no eliminará la idea de que está vinculando. ¿Pero qué significan las otras cosas? (-nf)

Actualización: está bien ... así que recordé que puedes encontrar estas cosas desde la línea de comandos. Esto es lo que descubrí al escribir ln --help:

-f, --force                 remove existing destination files
-n, --no-dereference        treat destination that is a symlink to a
                            directory as if it were a normal file

Pero esto todavía no me queda muy claro cuáles son las implicaciones de esto. ¿Por qué querría crear un enlace soft / sym como este?

Andrés
fuente
1
Incluso si no lo usa -s, puede eliminar el enlace sin eliminar el archivo original. Los enlaces duros aumentan el recuento de enlaces del archivo, por lo que no se eliminará cuando elimine solo uno de los enlaces.
Amok
Esa no es la diferencia entre un enlace duro y un enlace simbólico. Un enlace fijo apunta a los mismos bytes (inodo) en el disco. Un enlace suave apunta a otro archivo por nombre de archivo .
Greg Hewgill
También hay páginas de manual. es decir, ejecutar man ln. O hombre hombre, para aprender sobre ese sistema de ayuda. Puede obtener las páginas de manual en línea, también ...
Peter Cordes

Respuestas:

43

Desde la página de manual de BSD:

 -f    If the target file already exists, then unlink it so that the link
           may occur.  (The -f option overrides any previous -i options.)

 -n    If the target_file or target_dir is a symbolic link, do not follow
           it.  This is most useful with the -f option, to replace a symlink
           which may point to a directory.
estimula
fuente
32

la -nopción (junto con -f) obliga lna actualizar un enlace simbólico a un directorio. ¿Qué significa eso?

supongamos que tienes 2 directorios

  • foo
  • bar

y un enlace simbólico existente

  • baz -> bar

ahora desea actualizar baz para apuntar a foo en su lugar. si solo lo haces

ln -sf foo baz

obtendrías

  • baz / foo -> foo
  • baz -> bar (sin cambios), y por lo tanto
  • bar / foo -> foo

si agregas -n

ln -sfn foo baz

Consigues lo que quieres.

  • baz -> foo

eso es lo que significa 'sin desreferencia': no ​​resuelva un enlace existente y coloque el nuevo enlace dentro de ese directorio, sino simplemente actualícelo.

Marian Theisen
fuente
2
La respuesta más útil con diferencia.
kobejohn
1

Aquí están todas las opciones para ln. Encontrarás -n y -f aquí.

 -F    If the target file already exists and is a directory, then remove
       it so that the link may occur.
       The -F option should be used with either -f or -i options.  If
       none is specified, -f is implied.
       The -F option is a no-op unless -s option is specified.

 -h    If the target_file or target_dir is a symbolic link, do not
       follow it.  This is most useful with the -f option, to replace 
       a symlink which may point to a directory.

 -f    If the target file already exists, then unlink it so that the
       link may occur.  (The -f option overrides any previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file
       exists.  If the response from the standard input begins with the
       character `y' or `Y', then unlink the target file so that the link
       may occur.  Otherwise, do not attempt the link.  (The -i option
       overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.
bmargulies
fuente
-1

Puede escribir "man ln" para encontrar tales cosas:

   -f, --force
          remove existing destination files

   -n, --no-dereference
          treat destination that is a symlink to a directory as if it were
          a normal file
Derek Slager
fuente
20
Todavía no entiendo exactamente lo que eso significa
Andrew
-1

-f, --force eliminar archivos de destino existentes

-n, --no-dereference tratar el destino que es un enlace simbólico a un directorio como si fuera un archivo normal

ennuikiller
fuente
-5

-f dice que si el objetivo de su comando es un archivo existente, debe eliminarse y reemplazarse por el nuevo enlace. (Tenga en cuenta que en los sistemas influenciados por Unix, "archivo" puede incluir directorios, enlaces, tuberías, etc.)

-n modifica -f, diciendo que si el objetivo que se especifica es un enlace simbólico existente, debería no ser eliminado.

CarlF
fuente
3
Su descripción de -nestá mal. -fpor sí solo no reemplazará un enlace simbólico a un directorio. Al reemplazar un enlace simbólico a un directorio, -nes necesario tratar el enlace simbólico existente como un archivo normal en lugar de un directorio.
Brian