48

What does this do?

ln -nsf

I know ln -s creates a symbolic link, not a hard link which means you can delete it and it won't delete the thing that it's linking to. But what do the other command arguments mean? (-nf)

Update: okay...so I remembered you can find this stuff out from the command line. Here's what I found out from typing 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

But this still isn't very clear to me what the implications of this are. Why would I want to create a soft/sym link like this?

3
  • 1
    Even if you don't use -s you can delete the link without deleting the original file. Hard links increase the link count of the file so it won't be deleted when you delete only one of the links to it.
    – Amok
    Dec 10, 2009 at 2:08
  • That's not quite the difference between a hard link and a symbolic link. A hard link points to the same bytes (inode) on disk. A soft link points to another file by filename. Dec 10, 2009 at 2:10
  • There are also man pages. i.e. run man ln. Or man man, to learn about that help system. You can get man pages online, too... Dec 10, 2009 at 2:40

6 Answers 6

48

From the BSD man page:

 -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.
46

the -n option (together with -f) forces ln to update a symbolic link to a directory. what does that mean?

suppose you have 2 directories

  • foo
  • bar

and an existing symbolic link

  • baz -> bar

now you want to update baz to point to foo instead. if you just do

ln -sf foo baz

you would get

  • baz/foo -> foo
  • baz -> bar (unchanged), and thus
  • bar/foo -> foo

if you add -n

ln -sfn foo baz

you get what you want.

  • baz -> foo

that is what 'no-dereference' means: do not resolve an existing link and place the new link inside that directory, but rather just update it.

2
  • thanks for this explanation, i tested this for learning purposes and im wondering after ln -sf foo baz, why does it end up naming the link "foo"? that doesn't match with the parameters of the command Jan 20, 2022 at 18:48
  • by default, the link gets the same name as the original file. i.e. you can also do sth like ln -sf /some/absolute/path/to/some-file (no second argument) and it would create a link in your workind directory named some-file. Now if you add a 2nd param, which is an existing directory, it uses this as a target folder (instead of working dir) Jan 24, 2022 at 9:02
2

Here are all the options to ln. You'll find -n and -f in here.

 -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.
-1

You can type "man ln" to find such things:

   -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
2
  • 21
    i still don't exactly understand what that means
    – Andrew
    Dec 10, 2009 at 2:14
  • I think it means "just use the n option if you want it to behave the way you'd expect it to, instead of arbitrarily creating subdirectories that you never asked it to create". Oct 27, 2020 at 18:10
-1

-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

-5

-f says that if the target of your command is an existing file, it should be removed and replaced by the new link. (Note that in Unix-influenced systems, "file" can include directories, links, pipes, etc.)

-n modifies -f, saying that if the target you specify is an existing symbolic link, it should not be removed.

1
  • 3
    Your description of -n is wrong. -f by itself will not replace a symlink to a directory. When replacing a symlink to a directory, -n is needed to treat the existing symlink like a normal file instead of a directory.
    – Brian
    Mar 24, 2011 at 18:12

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .