Créer un lien symbolique - écraser s'il en existe un

54

Je veux prendre des données dans /path/to/data/folder/month/date/hour/minute/fileet symlink à /path/to/recent/fileet le faire automatiquement chaque fois qu'un fichier est créé.

En supposant que je ne sache pas à l’avance s’il /path/to/recent/fileexiste, comment puis-je procéder pour le créer (s’il n’existe pas) ou le remplacer (s’il existe)? Je suis sûr que je peux juste vérifier s'il existe et ensuite supprimer, un lien symbolique, mais je me demande s'il existe une commande simple qui fera ce que je veux en une étape.

drjrm3
la source
Si la destination existe, mais n'est pas un lien symbolique, que voulez-vous / attendez-vous qu'il se passe?
Toby Speight le

Réponses:

34

S'il vous plaît lire le manuel .

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

$ man ln

-n, --no-
dereference traite LINK_NAME en tant que fichier normal s'il s'agit d'un lien symbolique vers un répertoire

LithiumSix
la source
1
Pourquoi est-ce la bonne réponse?
Mrchief
1
@Mrchief Si /path/to/symlinkest déjà un lien symbolique vers un répertoire, sans l' -nindicateur, vous obtiendrez le lien symbolique créé au /path/to/symlink/targetlieu de le remplacer/path/to/symlink
Flimm
Notez que dans macOS, cela ne fonctionne toujours pas dans certains cas, pour les instances, quand /path/to/symlinkexiste et est un répertoire, mais pas un lien symbolique. Je pense que la seule façon de contourner ce problème est de courir en rm -rfpremier.
Flimm
78

Ceci est le but de lnl' -foption 's : il supprime les fichiers de destination existants, le cas échéant, avant de créer le lien.

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

créera le lien symbolique /path/to/recent/filepointant vers /path/to/data/folder/month/date/hour/minute/file, remplaçant tout fichier existant ou lien symbolique vers un fichier si nécessaire (et fonctionnant correctement si rien n’y existe déjà).

Si un répertoire, ou un lien symbolique vers un répertoire, existe déjà avec le nom de la cible, le lien symbolique sera créé à l'intérieur de celui-ci (vous obtiendrez donc /path/to/recent/file/filel'exemple précédent). L' -noption, disponible dans certaines versions de ln, s'occupera des liens symboliques vers les répertoires pour vous, en les remplaçant si nécessaire:

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

POSIXln ne spécifie pas -n, vous ne pouvez donc pas compter dessus. Une grande partie du lncomportement de est définie par l'implémentation. Vous devez donc vérifier les spécificités du système que vous utilisez. Si vous utilisez GNUln , vous pouvez également utiliser les options -tet -Tpour rendre son comportement parfaitement prévisible en présence de répertoires ( c’est- à- dire, échouez au lieu de créer le lien dans le répertoire existant avec le même nom).

Stephen Kitt
la source