Crear enlace simbólico - sobrescribir si existe

54

Quiero extraer datos /path/to/data/folder/month/date/hour/minute/filey vincularlos /path/to/recent/filey hacer esto automáticamente cada vez que se crea un archivo.

Suponiendo que no sabré de antemano si /path/to/recent/fileexiste, ¿cómo puedo crearlo (si no existe) o reemplazarlo (si existe)? Estoy seguro de que solo puedo verificar si existe y luego hacer una eliminación, un enlace simbólico, pero me pregunto si hay un comando simple que haga lo que quiero en un solo paso.

drjrm3
fuente
Si el destino existe, pero no es un enlace simbólico, ¿qué desea / espera que suceda?
Toby Speight

Respuestas:

34

Por favor lea el manual .

ln -sfn /new/target /path/to/symlink

$ man ln

-n, --no-
dereference trata LINK_NAME como un archivo normal si es un enlace simbólico a un directorio

LithiumSix
fuente
1
¿Por qué es esta la respuesta correcta?
Mrchief
1
@Mrchief Si /path/to/symlinkya es un enlace simbólico a un directorio, sin la -nbandera, obtendrá el enlace simbólico creado en /path/to/symlink/targetlugar de reemplazarlo/path/to/symlink
Flimm
Tenga en cuenta que en macOS, esto todavía no funciona en algunos casos, por ejemplo, cuando /path/to/symlinkexiste y es un directorio, pero no un enlace simbólico. Creo que la única forma de evitarlo es correr rm -rfprimero.
Flimm
78

Este es el propósito de lnla -fopción: elimina los archivos de destino existentes, si los hay, antes de crear el enlace.

ln -sf /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

creará el enlace simbólico al que /path/to/recent/fileapunta /path/to/data/folder/month/date/hour/minute/file, reemplazando cualquier archivo existente o enlace simbólico a un archivo si es necesario (y funcionará bien si ya no hay nada allí).

Si ya existe un directorio, o enlace simbólico a un directorio con el nombre de destino, el enlace simbólico se creará dentro de él (por lo que terminaría /path/to/recent/file/fileen el ejemplo anterior). La -nopción, disponible en algunas versiones de ln, se encargará de los enlaces simbólicos a los directorios, reemplazándolos según sea necesario:

ln -sfn /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

POSIXln no especifica, -npor lo que no puede confiar en él en general. Gran parte del lncomportamiento está definido por la implementación, por lo que realmente necesita verificar los detalles del sistema que está utilizando. Si está utilizando GNUln , también puede usar las opciones -ty -T, para hacer que su comportamiento sea completamente predecible en presencia de directorios ( es decir, falla en lugar de crear el enlace dentro del directorio existente con el mismo nombre).

Stephen Kitt
fuente