I want to take down data in /path/to/data/folder/month/date/hour/minute/file and symlink it to /path/to/recent/file and do this automatically every time a file is created.

Assuming I will not know ahead of time if /path/to/recent/file exists, how can I go about creating it (if it doesn't exist) or replacing it (if it does exist)? I am sure I can just check if it exists and then do a delete, symlink, but I'm wondering if there is a simple command which will do what I want in one step.

up vote 45 down vote accepted

This is the purpose of ln's -f option: it removes existing destination files, if any, before creating the link.

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

will create the symlink /path/to/recent/file pointing to /path/to/data/folder/month/date/hour/minute/file, replacing any existing file or symlink to a file if necessary (and working fine if nothing exists there already).

If a directory, or symlink to a directory, already exists with the target name, the symlink will be created inside it (so you'd end up with /path/to/recent/file/file in the example above). The -n option, available in some versions of ln, will take care of symlinks to directories for you, replacing them as necessary:

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

POSIX ln doesn’t specify -n so you can’t rely on it generally. Much of ln’s behaviour is implementation-defined so you really need to check the specifics of the system you’re using. If you’re using GNU ln, you can use the -t and -T options too, to make its behaviour fully predictable in the presence of directories (i.e. fail instead of creating the link inside the existing directory with the same name).

Please read the manual.

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

$ man ln

-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory

  • 2
    Actually, this is the correct answer. – az3 Feb 17 '17 at 12:00
  • @drjrm3 please select this as the answer... – Xavi Montero Apr 11 '17 at 13:39
  • Why is this the correct answer? – Mrchief Jun 19 '17 at 18:02
  • 1
    @Mrchief If /path/to/symlink is already a symlink to a directory, without the -n flag, you'll get the symlink created in /path/to/symlink/target instead of replacing /path/to/symlink – Flimm Jun 22 '17 at 10:42
  • Note that in macOS, this still doesn't work in some cases, for instances, when /path/to/symlink exists and is a directory, and but not a symlink. I think the only way to work around it is to run rm -rf first. – Flimm Jun 22 '17 at 10:47

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.