This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: rm fails to remove symbolic links to directories


> Just upgraded to the latest versions moments ago.
> I had created a symbolic link to a directory some time ago.
> 
> If I try and remove the symlink using Bash I get the following error:
> 
> rm: cannot remove directory `xxxxx/': Is a directory

For rm, POSIX requires that when a trailing / is applied, that the target of the symlink is affected, but when it is omitted, the symlink is affected.  It also requires that rm cannot remove directories unless you use -r, but that using -r removes what was specified (directory or otherwise).  Also, the rmdir command exists for deleting empty directories.  rm -r is powerful because it deletes directories whether they are empty or not, so sometimes you really want rmdir for the safety factor.  But rmdir does not remove symlinks, you need rm for that.

Your 'problem' is not unique to cygwin.  Observe:

$ mkdir foo
$ touch foo/file
$ ln -s foo bar
$ ls bar             # list the symlink's name
bar
$ ls bar/            # list the target's contents
file
$ rm bar/           # attempts to remove foo, which is non-empty directory
rm: cannot remove directory `bar/': Is a directory
$ rm bar             # succeeds in removing bar, which is symlink
$ ln -s foo bar
$ rm -r bar          # succeeds in removing bar, which is a symlink
$ ls foo               # only symlink was removed, foo is still intact
file
$ ln -s foo bar
$ rmdir bar
rmdir: `bar': Not a directory
$ rmdir bar/
rmdir: `bar/': Directory not empty
$ rm -r bar/        # recursively removes foo, but leaves bar intact
$ ls foo bar bar/
ls: foo: No such file or directory
bar
ls: bar/: No such file or directory

> 
> If I then empty the contents of the directory and repeat the 'rm xxxxx' command 
> I get the same error.  Trying 'rm -df xxxxx' also failed.

rm -d is a GNU extension, and only works on systems where link(2) and unlink(2) work on directories (hard-linking directories is allowed, but not required, by POSIX, and it is often discouraged because it can lead to circular directory structures and file system problems).  Cygwin is not one of those systems, so rm -d will not remove a directory.  It does not imply -r (take it upstream to the bug-coreutils list if you thing -d should imply -r).

Bash tab completion is configurable as to whether it appends / to the end of a symlink-to-a-directory.  This is controlled by `set mark-symlinked-directories on' in your ~/.inputrc.  Usually, I like it on, but in the case of removing a symlink-to-dir, it means I have to remember to manually delete the / that was appended by the tab-completion when I meant the symlink itself.

--
Eric Blake



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]