web-dev-qa-db-fra.com

Pourquoi utiliser 'ln -sf' sous Linux?

J'ai 2 questions. Le premier est pour le -sf options et le second est pour l'utilisation plus spécifique de -f options.

En googling, j'ai compris la description de la commande ln, option -s et -f.

(copier à partir de http://linux.about.com/od/commands/l/blcmdl1_ln.htm )

-s, --symbolic : make symbolic links instead of hard links
-f, --force : remove existing destination files

Je comprends ces options individuellement. Mais comment pourrait-on utiliser ceci -s et -f options simultanément? -s est utilisé pour créer un fichier de liaison et -f est utilisé pour supprimer un fichier de liaison. Pourquoi utiliser cette option fusionnée?

Pour en savoir plus sur la commande ln, j'ai fait quelques exemples.

$ touch foo     # create sample file
$ ln -s foo bar # make link to file
$ vim bar       # check how link file works: foo file opened
$ ln -f bar     # remove link file 

Tout fonctionne bien avant la prochaine commande

$ ln -s foo foobar
$ ln -f foo     # remove original file

Par la description de -f Option, cette dernière commande ne doit pas fonctionner, mais ça fait! foo est supprimé.

Pourquoi cela arrive-t-il?

22
casamia

Tout d'abord, pour trouver les options d'une commande. Vous pouvez utiliser man command. Donc, si vous courez man ln, tu verras:

   -f, --force
          remove existing destination files

   -s, --symbolic
          make symbolic links instead of hard links

Maintenant le -s, comme vous l'avez dit, est de rendre le lien symbolique par opposition au dur. Les -f Cependant, il ne faut pas supprimer le lien. Il est d'écraser le fichier de destination si l'on existe. Pour illustrer:

 $ ls -l
total 0
-rw-r--r-- 1 terdon terdon 0 Mar 26 13:18 bar
-rw-r--r-- 1 terdon terdon 0 Mar 26 13:18 foo

$ ln -s foo bar  ## fails because the target exists
ln: failed to create symbolic link ‘bar’: File exists

$ ln -sf foo bar   ## Works because bar is removed and replaced with the link
$ ls -l
total 0
lrwxrwxrwx 1 terdon terdon 3 Mar 26 13:19 bar -> foo
-rw-r--r-- 1 terdon terdon 0 Mar 26 13:18 foo
44
terdon
By default, each destination (name of new link) should not already exist.
  [...]   

--backup[=CONTROL]
              make a backup of each existing destination file
  [...]

 -f, --force
              remove existing destination files

Vous devez lire attentivement pour comprendre ce que l'on entend dans man ln. "Supprimer" est un peu trompeur sans le contexte.

Avec -i vous avez la question suivante:

ln: replace 'q2'? y

Supprimer, écraser, remplacer ...


POSIX (man 1p ln) a:

-f
    Force existing destination pathnames to be removed to allow the link.

C'est une très bonne addition "... pour permettre le lien".


Et info ln a:

Normalement 'ln' ne remplace pas les fichiers existants. Utilisez l'option '-force' ('-f') à remplacer les == les inconditionnellement, l'option '--interActive' ('I ') pour les remplacer de manière conditionnelle et le' - Packup '(' -B ') Option à renommer eux.

Exemple "- Backup": avec un _ existant qli -> qqq:

ln -sb ttt qli

09:10 qli -> ttt
08:47 qli~ -> qqq
0
rastafile