Symbolischer Link kann nicht gelöscht werden

7

Ich habe versehentlich die Parameter meines ln umgekehrt und aufgerufen:

ln -s my_link my_dir

wo my_dir bereits existierte und my_link nicht. Ich habe my_dir gelöscht, kann aber my_link nicht löschen.

Wenn ich das übergeordnete Verzeichnis von my-link ls -l habe, erhalte ich 1 von 2 verschiedenen Antworten, entweder:

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

oder:

lrwxrwxrwx 1 username username 8 Mar 20 16:34 my_link

Wenn ich anrufe, rm my_linkbekomme ich:

rm: cannot remove `my_link': Not a directory

Ich bin mir nicht sicher, ob es relevant ist, aber my_link befindet sich auf einem im Netzwerk bereitgestellten Laufwerk.

Weiß jemand, was ich hier gemacht habe und wie man den defekten Link entfernt?

Bearbeiten: Ich habe meine bash_history durchgesehen und die Befehle gefunden, die ich ausgeführt habe. Es sieht so aus, als hätte ich my_dir nicht wirklich gelöscht, es hat einfach aufgehört zu sein. Und ich habe mehrere Versionen des falschen ln-Befehls ausgeführt.

Hier ist die unbearbeitete Liste der Befehle, die ich ausgeführt habe, bevor der Fehler gelöscht wurde:

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

Sie werden feststellen, dass ich my_link und my_dir abgeschafft habe. Die tatsächlichen Namen sind beide test_dir, und dies hat wahrscheinlich zu meiner Verwirrung beigetragen (ein Fehler, den ich hoffentlich nie wieder machen werde).

Jetzt gibt es also kein Verzeichnis mehr ~ / test_dir, es gibt ein Verzeichnis ~ / netdrive / test_dir / und es gibt den defekten Link ~ / netdrive / test_dir / test_dir

Es ist das letzte, das ich löschen möchte. Ich hoffe, das klärt das Wasser eher als es zu trüben.

Bearbeiten 2 :

Mein Betriebssystem ist CentOS und ich bin mir ziemlich sicher, dass das Netzlaufwerk ein Samba ist.

Hier sind die letzten Zeilen der Ausgabe von 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)                           = ?

Und die letzten paar Zeilen aus 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)                           = ?
ben
quelle
Welche Art von Dateisystem ist gemountet? Auf einem lokalen System hätten Sie einen Link my_link -> my_linkinnerhalb von erstellt my_dir.
Kyle Smith
@KyleSmith my_link befindet sich auf einem cifs-Laufwerk und my_dir befindet sich auf einem lokalen Laufwerk.
Ben
Welches Betriebssystem verwenden Sie? Welcher Servertyp stellt die CIFS-Freigabe bereit (z. B. Samba, Windows, ...)?
Ansgar Esztermann

Antworten:

9

Stellen Sie sicher, dass Sie kein nachfolgendes / einschließen

dh rm my_linkNICHTrm my_link/

Das nachfolgende / gibt an, dass Sie den Inhalt über den Symlink hinaus löschen möchten

NcA
quelle
Ich habe keinen abschließenden Schrägstrich in meinem RM (und Autocomplete fügt ihn nicht einmal für mich hinzu)
Ben
3

Versuche es:

rm -rf my_link

Ich habe es auf einem lokalen Dateisystem und einem Netzwerk-Dateisystem (NFS) getestet und es hat funktioniert.

aseq
quelle
Ich erhalte den gleichen Fehler, wenn ich -r hinzufüge, und -rf unterdrückt nur den Fehler und löscht den Link nicht
ben
Wie haben Sie my_dir gelöscht? Wenn ich wiederhole, was Sie getan haben, landet my_link in my_dir und Sie können NUR my_dir nur löschen, wenn es leer ist.
Aseq
2

Hast du es versucht rm -rf my_link?

Lucas Kauffman
quelle
Ich erhalte den gleichen Fehler, wenn ich -r hinzufüge, und -rf unterdrückt nur den Fehler und löscht den Link nicht
ben
Haben Sie versucht, den Befehl zum Aufheben der Verknüpfung zu verwenden? Wenn dies nicht funktioniert, erstellen Sie einen Link mit demselben Namen wie dieser Link zu einem Ordner und verwenden Sie dann ulink.
Lucas Kauffman
Angenommen, Sie meinten ulink, erhalte ich den gleichen Fehler wie rm. Ich habe ln -s other / my_link ausprobiert und bekam: "ln: Zugriff auf` my_link ': Kein Verzeichnis "
ben
2

Bitte versuche

unlink test_dir

Wenn dies nicht hilft, fügen Sie bitte die Ausgabe von hinzu

strace -f -v unlink test_dir

und

strace -f -v rm test_dir

(Es werden nur die letzten Zeilen benötigt - beginnend mit 'unlink' oder 'newfstatat'.)

Andreas Florath
quelle
unlink gab den Fehler: Verknüpfung von test_dir kann nicht aufgehoben werden: Kein Verzeichnis. Und ich habe die Ausgabe der Straces zu der Frage hinzugefügt.
Ben
Sehr seltsam: IMHO bedeutet dies, dass der Pfad irgendwann etwas enthält, das kein Verzeichnis ist, wie es ist touch h; unlink h/o. Haben Sie versucht, den absoluten Pfad zu rm / unlink anzugeben? (Ich kann die Dinge nicht erklären, es ist nur ein Versuch.)
Andreas Florath
1

Ich habe es geschafft, das zu lösen, obwohl ich nicht ganz verstehe, wie oder was wirklich schief gelaufen ist.

Beim Betrachten von Mystery-Dateien, "kein Verzeichnis" , fand ich jemanden mit einem ähnlichen Problem. Sie konnten die "Mystery-Datei" löschen, indem sie in den Computer ssh'ing, der die Freigabe durchführte, und die Datei von dort löschten.

Ich habe keine SSH-Berechtigungen für diesen Computer, aber ich kann FTP. Und erstaunlicherweise konnte ich den Link löschen.

Ich denke, das Problem war eine Kombination aus Samba und schlechten Anrufen. Vielen Dank für all Ihre Hilfe bei der Sortierung.

ben
quelle
1

Ich habe das gleiche Symptom von einem CentOS-Client auf einer CIFS-gemounteten Ressource.

Für mich hängt das Problem damit zusammen, ob das Ziel des Symlinks zu dem Zeitpunkt vorhanden ist, zu dem Sie versuchen, den Symlink zu entfernen. Wenn das Ziel vorhanden ist, funktioniert es. Wenn das Ziel nicht vorhanden ist, schlägt das Entfernen des Symlinks fehl.

$ 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

Der gleiche Test, der auf einem lokalen Dateisystem durchgeführt wird, funktioniert einwandfrei (dh der defekte Symlink kann erfolgreich entfernt werden).

Mein CIFS-Client ist ein CentOS 7, das das Paket cifs-utils verwendet. Dieses CentOS ist ein Gast auf VirtualBox auf einem Windows 7-Host. Dies sollte jedoch keine Rolle spielen, da das Netzwerkgerät in diesem Szenario virtualisiert ist und nicht das Dateisystem oder das Speichergerät.

Mein CIFS-Server ist eine Synology NAS-Box mit DSM 5.2, für die die Unterstützung symbolischer Links in den CIFS / SMB-Optionen aktiviert ist.

-> Können andere Personen dieses Verhalten bestätigen? -> Irgendeine Erklärung?

Andy

Andreas Maier
quelle