I have a directory like this:
$ ls -l total 899166 drwxr-xr-x 12 me scicomp 324 Jan 24 13:47 data -rw-r--r-- 1 me scicomp 84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda drwxr-xr-x 2 me scicomp 808 Jan 24 13:47 log lrwxrwxrwx 1 me scicomp 17 Jan 25 09:41 msg -> /home/me/msg And I want to remove it using rm -r.
However I'm scared rm -r will follow the symlink and delete everything in that directory (which is very bad).
I can't find anything about this in the man pages. What would be the exact behavior of running rm -rf from a directory above this one?
3 Answers
Example 1: Deleting a directory containing a soft link to another directory.
susam@nifty:~/so$ mkdir foo bar susam@nifty:~/so$ touch bar/a.txt susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz susam@nifty:~/so$ tree . ├── bar │ └── a.txt └── foo └── baz -> /home/susam/so/bar/ 3 directories, 1 file susam@nifty:~/so$ rm -r foo susam@nifty:~/so$ tree . └── bar └── a.txt 1 directory, 1 file susam@nifty:~/so$ So, we see that the target of the soft-link survives.
Example 2: Deleting a soft link to a directory
susam@nifty:~/so$ ln -s /home/susam/so/bar baz susam@nifty:~/so$ tree . ├── bar │ └── a.txt └── baz -> /home/susam/so/bar 2 directories, 1 file susam@nifty:~/so$ rm -r baz susam@nifty:~/so$ tree . └── bar └── a.txt 1 directory, 1 file susam@nifty:~/so$ Only, the soft link is deleted. The target of the soft-link survives.
Example 3: Attempting to delete the target of a soft-link
susam@nifty:~/so$ ln -s /home/susam/so/bar baz susam@nifty:~/so$ tree . ├── bar │ └── a.txt └── baz -> /home/susam/so/bar 2 directories, 1 file susam@nifty:~/so$ rm -r baz/ rm: cannot remove 'baz/': Not a directory susam@nifty:~/so$ tree . ├── bar └── baz -> /home/susam/so/bar 2 directories, 0 files The file in the target of the symbolic link does not survive.
The above experiments were done on a Debian GNU/Linux 9.0 (stretch) system.
3Your /home/me/msg directory will be safe if you rm -rf the directory from which you ran ls. Only the symlink itself will be removed, not the directory it points to.
The only thing I would be cautious of, would be if you called something like "rm -rf msg/" (with the trailing slash.) Do not do that because it will remove the directory that msg points to, rather than the msg symlink itself.
2rm should remove files and directories. If the file is symbolic link, link is removed, not the target. It will not interpret a symbolic link. For example what should be the behavior when deleting 'broken links'- rm exits with 0 not with non-zero to indicate failure