Что означает «ln -sf» в Linux?

21

У меня есть 2 вопроса. Первый предназначен для -sfпараметров, а второй - для более конкретного использования -fпараметров.

Погуглив, я разобрался с описанием команды ln, опции -sи -f.

(копия с 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

Я понимаю эти варианты индивидуально. Но как можно использовать это -sи -fпараметры одновременно? -sиспользуется для создания файла ссылки и -fиспользуется для удаления файла ссылки. Я не могу понять эту ситуацию и зачем использовать эту опцию слияния.

Чтобы узнать больше о lnкоманде, я сделал несколько примеров.

$ 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 

Все отлично работает до следующей команды

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

По описанию -fопции эта последняя команда не должна работать, но она работает! fooудален.

Почему это происходит?

Casamia
источник
3
-fобозначает силу ( --force); не для удаления!
Pandya
3
Чтобы добавить причину к ответу Тердона ... Одним из способов использования является ручное обновление библиотек. Если вы сделаете это в два этапа - сначала rm, чтобы удалить старую ссылку, затем ln -s, чтобы создать новую, - библиотека не будет работать между операциями ... что становится большой проблемой, если команде ln нужна библиотека работать. Таким образом, с помощью ln -sf старая ссылка заменяется новой, причем ссылка никогда не нарушается.
Баард Копперуд

Ответы:

42

Прежде всего, чтобы узнать, что делают параметры команды, вы можете использовать man command. Итак, если вы запустите man ln, вы увидите:

   -f, --force
          remove existing destination files

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

Теперь, -sкак вы сказали, сделать ссылку символической, а не жесткой. -f, Однако, не удалить ссылку. Он должен перезаписать файл назначения, если он существует. Проиллюстрировать:

 $ 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
Тердон
источник