Não é possível excluir o link simbólico

7

Eu acidentalmente inverti os parâmetros do meu ln e chamei:

ln -s my_link my_dir

onde my_dir já existia e my_link não. Eu deletei meu_dir, mas não consigo excluir meu_link.

Se eu ls -l o diretório pai do meu_link eu recebo 1 de 2 respostas diferentes:

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

ou:

lrwxrwxrwx 1 username username 8 Mar 20 16:34 my_link

Se eu chamar rm my_link , obtenho:

rm: cannot remove 'my_link': Not a directory

E, não tenho certeza se é relevante, mas meu_link reside em uma unidade montada em rede.

Alguém sabe o que eu fiz aqui e como remover o link quebrado?

Editar: Eu olhei através do meu bash_history e encontrei os comandos que eu corri. Parece que eu realmente não deletei meu_dir, ele simplesmente deixou de ser. E eu corri várias versões do comando errado ln.

Esta é a lista de comandos não editados que eu executei antes de obter o erro de exclusão:

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

Você notará que eu acabei com my_link e my_dir. Os nomes reais são ambos test_dir, e isso provavelmente contribuiu para um pouco da minha confusão (um erro que espero nunca mais fazer).

Então agora não há mais um diretório ~ / test_dir, existe um diretório ~ / netdrive / test_dir / e há o link quebrado ~ / netdrive / test_dir / test_dir

É o último que estou tentando excluir. Espero que esclarece em vez de enlamear mais a água.

Editar 2 :

Meu sistema operacional é o CentOS e tenho certeza que a unidade de rede é um Samba.

Aqui estão as últimas linhas de saída de 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)                           = ?

E as últimas duas linhas de 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)                           = ?
    
por ben 20.03.2012 / 22:08

6 respostas

8

Verifique se você não está incluindo um /

i.e. rm my_link NÃO rm my_link/

O trailing / denota que você gostaria de excluir o conteúdo além do link simbólico

    
por 20.03.2012 / 22:15
3

Tente fazer:

rm -rf my_link

Eu testei em um sistema de arquivos local e em um sistema de arquivos de rede (NFS) e funcionou.

    
por 20.03.2012 / 22:13
2

Você já tentou rm -rf my_link ?

    
por 20.03.2012 / 22:14
2

Por favor, tente

unlink test_dir

Se isso não ajudar, adicione a saída

strace -f -v unlink test_dir

e

strace -f -v rm test_dir

(Somente as últimas linhas - iniciando de 'unlink' ou 'newfstatat' são necessárias.)

    
por 21.03.2012 / 09:14
1

Consegui resolver isso, apesar de não entender completamente como ou o que realmente deu errado.

Analisando os arquivos Mistério, "não um diretório" , encontrei alguém com um problema semelhante. Eles foram capazes de apagar o "arquivo de mistério" por ssh'ing na máquina que estava fazendo o compartilhamento e excluir o arquivo de lá.

Eu não tenho privilégios ssh para essa máquina, mas posso FTP. E, surpreendentemente, consegui excluir o link.

Eu acho que o problema foi uma combinação de chamadas do Samba e do Bad In. Obrigado por toda sua ajuda para resolver isso.

    
por 21.03.2012 / 17:24
1

Eu tenho o mesmo sintoma de um cliente CentOS em um recurso montado em CIFS.

Para mim, o problema está relacionado a se o destino do symlink existe no momento em que você tenta remover o symlink. Se o destino existe, funciona. Se o alvo não existir, a remoção do symlink falhará.

$ touch a
$ ln -s a b
$ 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

O mesmo teste, quando executado em um sistema de arquivos local, funciona bem (ou seja, o link simbólico quebrado pode ser removido com sucesso).

Meu cliente CIFS é um CentOS 7, usando o pacote cifs-utils. O CentOS é um convidado no VirtualBox em um host do Windows 7, mas isso não deve importar, porque o dispositivo de rede é virtualizado nesse cenário, e não no sistema de arquivos ou no dispositivo de armazenamento.

Meu servidor CIFS é uma caixa Synology NAS com o DSM 5.2, com suporte de link simbólico ativado em suas opções CIFS / SMB.

- > Outras pessoas podem confirmar esse comportamento? - > Alguma explicação?

Andy

    
por 06.01.2016 / 14:50