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

5

Eu tenho um link simbólico anteriormente apontando para um diretório do Dropbox. Não sei o que fiz de errado, mas aparentemente agora aponta para si mesmo.

hyper@mypi:/home/hyper/test$ ls -l
total 1024
lrwxrwxrwx 1 hyper hyper 7 Feb 15  2013 Dropbox -> Dropbox

Quando tento remover o link, obtenho:

hyper@mypi:/home/hyper/test$ rm Dropbox
rm: cannot remove ‘Dropbox’: Not a directory

O que mais eu posso tentar me livrar desse link?

Parte da saída do Strace rm Dropbox:

close(3)                                = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "Dropbox", {st_mode=S_IFLNK|0777, st_size=7, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid()                               = 1000
newfstatat(AT_FDCWD, "Dropbox", {st_mode=S_IFLNK|0777, st_size=7, ...}, AT_SYMLINK_NOFOLLOW) = 0
unlinkat(AT_FDCWD, "Dropbox", 0)        = -1 ENOTDIR (Not a directory)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f7ce00fc000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2570
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f7ce00fc000, 4096)            = 0
open("/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=619, ...}) = 0
mmap(NULL, 619, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f7ce00fc000
close(3)                                = 0
open("/usr/lib/charset.alias", O_RDONLY|O_NOFOLLOW) = -1 ENOENT (No such file or directory)
write(2, "rm: ", 4rm: )                     = 4
write(2, "cannot remove 200Dropbox201", 27cannot remove ‘Dropbox’) = 27
open("/usr/share/locale/en_US/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)
open("/usr/share/locale-langpack/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/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
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
close(1)                                = 0
close(2)                                = 0
exit_group(1)                           = ?
+++ exited with 1 +++
    
por HyperCube 17.02.2014 / 11:27

1 resposta

2

A mensagem de erro não se refere ao symlink, mas ao diretório atual!

man 2 unlinkat:

int unlinkat(int dirfd, const char *pathname, int flags);

ERRORS

ENOTDIR

pathname is relative and dirfd is a file descriptor referring to a file other than a directory.

Assim você deve cd pelo menos um nível acima e dar uma olhada no diretório. Ele foi excluído ou algo assim (geralmente não é possível quando é a CWD de um processo).

    
por 17.02.2014 / 13:39