无法删除符号链接

我不小心扭转了我的ln的参数,并打电话给:

ln -s my_link my_dir 

my_dir已经存在,my_link没有。 我删除了my_dir,但无法删除my_link。

如果我ls -l my_link的父目录,我得到2个不同的响应中的一个:

 l????????? ? ? ? ? ? my_link 

要么:

 lrwxrwxrwx 1 username username 8 Mar 20 16:34 my_link 

如果我打电话rm my_linkrm my_link我会得到:

 rm: cannot remove `my_link': Not a directory 

而且,我不确定是否相关,但my_link驻留在networking安装的驱动器上。

有谁知道我在这里做了什么,以及如何删除断开的链接?

编辑:我通过我的bash_history看,发现我跑的命令。 它看起来像我没有真正删除my_dir,它只是停止。 我跑了好几个版本的错误的ln命令。

这是我在得到错误删除之前运行的未经编辑的命令列表:

 ln -s test_dir ~/netdrive/test_dir/ ln -s test_dir ~/netdrive/test_dir ln -s test_dir/ ~/netdrive/test_dir/ 

你会注意到我已经取消了my_link和my_dir。 实际的名称都是test_dir,这可能会导致我的一些困惑(我希望不会再犯的一个错误)。

所以现在不再有〜/ test_dir目录了〜/ netdrive / test_dir目录下有〜/ netdrive / test_dir / test_dir目录

这是我试图删除的最后一个。 我希望澄清,而不是更多的泥水。

编辑2

我的操作系统是CentOS,我很确定networking驱动器是Samba。

这是strace -f -v unlink test_dir的最后几行输出:

 unlink("test_dir") = -1 ENOTDIR (Not a directory) open("/usr/share/locale/locale.alias", O_RDONLY) = 3 fstat(3, {st_dev=makedev(8, 3), st_ino=1573552, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2512, st_atime=2012/03/21-02:19:02, st_mtime=2012/03/15-13:42:39, st_ctime=2012/03/16-05:31:49}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc843b2f000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2512 read(3, "", 4096) = 0 close(3) = 0 munmap(0x7fc843b2f000, 4096) = 0 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3 fstat(3, {st_dev=makedev(8, 3), st_ino=1575882, st_mode=S_IFREG|0644, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=435, st_atime=2012/03/20-11:53:41, st_mtime=2011/12/07-16:51:00, st_ctime=2011/12/21-05:34:01}) = 0 mmap(NULL, 435, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc843b2f000 close(3) = 0 write(2, "unlink: ", 8unlink: ) = 8 write(2, "cannot unlink `test_dir'", 24cannot unlink `test_dir') = 24 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) write(2, ": Not a directory", 17: Not a directory) = 17 write(2, "\n", 1 ) = 1 close(1) = 0 close(2) = 0 exit_group(1) = ? 

最后几行strace -f -v rm test_dir

 newfstatat(AT_FDCWD, "test_dir", 0x7fff71464640, AT_SYMLINK_NOFOLLOW) = -1 ENOTDIR (Not a directory) open("/usr/share/locale/locale.alias", O_RDONLY) = 3 fstat(3, {st_dev=makedev(8, 3), st_ino=1573552, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=2512, st_atime=2012/03/21-02:19:02, st_mtime=2012/03/15-13:42:39, st_ctime=2012/03/16-05:31:49}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f039e56b000 read(3, "# Locale name alias data base.\n#"..., 4096) = 2512 read(3, "", 4096) = 0 close(3) = 0 munmap(0x7f039e56b000, 4096) = 0 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3 fstat(3, {st_dev=makedev(8, 3), st_ino=1575882, st_mode=S_IFREG|0644, st_nlink=2, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=8, st_size=435, st_atime=2012/03/20-11:53:41, st_mtime=2011/12/07-16:51:00, st_ctime=2011/12/21-05:34:01}) = 0 mmap(NULL, 435, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f039e56b000 close(3) = 0 write(2, "rm: ", 4rm: ) = 4 write(2, "cannot remove `test_dir'", 24cannot remove `test_dir') = 24 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) write(2, ": Not a directory", 17: Not a directory) = 17 write(2, "\n", 1 ) = 1 close(0) = 0 close(1) = 0 close(2) = 0 exit_group(1) = ? 

确保你不包括尾随/

rm my_link NOT rm my_link/

尾部/表示您希望删除符号链接之外的内容

试着做:

 rm -rf my_link 

我在本地文件系统和networking文件系统(NFS)上testing过它,并且工作正常。

你有没有试过rm -rf my_link

请尝试

 unlink test_dir 

如果这没有帮助,请添加输出

 strace -f -v unlink test_dir 

 strace -f -v rm test_dir 

(只需要最后几行 – 从'unlink'或'newfstatat'开始。)

我设法解决这个问题,尽pipe我并不完全明白究竟是怎么发生了什么问题。

看着神秘的文件,“不是目录” ,我find了一个类似的问题。 他们能够通过ssh'ing删除正在进行共享的机器中的“神秘文件”,并从那里删除文件。

我没有SSH的权限,但我可以FTP。 而且,令人惊讶的是,我能够删除链接。

我猜这个问题是Samba和坏的ln调用的组合。 感谢您得到这个sorting的所有帮助。

我从CIFS挂载资源上的CentOS客户端出现同样的症状。

对于我来说,这个问题与你试图删除符号链接的时间点是否存在符号链接的目标有关。 如果目标存在,它就起作用。 如果目标不存在,则删除符号链接失败。

 $ touch a $ ln -sab $ ls -l total 0 -rw-rw-r--. 1 andi andi 0 Jan 6 14:42 a lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a # Remove link target target and then try to remove link: $ rm a $ ls -l total 0 lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a # With colors on, the b and a are now marked red $ rm b rm: cannot remove 'b': No such file or directory $ ls -l total 0 lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a # With colors on, the b and a are now marked red # Reestablish link target target and then try to remove link: $ touch a $ ls -l total 0 -rw-rw-r--. 1 andi andi 0 Jan 6 14:44 a lrwxrwxrwx. 1 andi andi 1 Jan 6 14:42 b -> a $ rm b $ ls -l total 0 -rw-rw-r--. 1 andi andi 0 Jan 6 14:44 a 

当在本地文件系统上执行相同的testing时,工作正常(即,可以成功删除损坏的符号链接)。

我的CIFS客户端是CentOS 7,使用cifs-utils软件包。 CentOS是Windows 7主机上的VirtualBox上的guest虚拟机,但这应该不重要,因为networking设备在此scheme中是虚拟化的,而不是文件系统或存储设备。

我的CIFS服务器是带有DSM 5.2的Synology NAS盒,在其CIFS / SMB选项中启用了符号链接支持。

– >其他人可以证实这种行为吗? – >任何解释?

安迪