Я случайно изменил параметры своего ln и вызвал:
ln -s my_link my_dir
где my_dir уже существует, а my_link - нет. Я удалил my_dir, но не могу удалить my_link.
Если я ls -l my_link родительский каталог, я получаю 1 из 2 разных ответов:
l????????? ? ? ? ? ? my_link
или:
lrwxrwxrwx 1 username username 8 Mar 20 16:34 my_link
Если я позвоню rm my_link
Я получил:
rm: cannot remove `my_link': Not a directory
И я не уверен, актуально ли это, но my_link находится на сетевом диске.
Кто-нибудь знает, что я здесь сделал, и как удалить битую ссылку?
Редактировать: Я просмотрел свою 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, и я почти уверен, что сетевой диск - это 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
НЕ rm my_link/
Завершающий / означает, что вы хотите удалить содержимое за пределами символической ссылки.
Стараться сделать:
rm -rf my_link
Я протестировал его в локальной файловой системе и в сетевой файловой системе (NFS), и он работал.
Ты пробовала rm -rf my_link
?
Пожалуйста попробуйте
unlink test_dir
Если это не помогает, добавьте вывод
strace -f -v unlink test_dir
и
strace -f -v rm test_dir
(Требуются только последние несколько строк - начиная с unlink или newfstatat.)
Мне удалось решить эту проблему, хотя я не совсем понимаю, как или что на самом деле пошло не так.
Смотря на Загадочные файлы, а не каталог, Я нашел человека с похожей проблемой. Они смогли удалить «загадочный файл» с помощью ssh'инга на машину, которая делала общий доступ, и удалить файл оттуда.
У меня нет прав ssh для этой машины, но я могу использовать FTP. И, что удивительно, мне удалось удалить ссылку.
Я предполагаю, что проблема заключалась в сочетании Samba и плохих вызовов ln. Спасибо за вашу помощь в этом.
У меня такой же симптом от клиента CentOS на смонтированном ресурсе CIFS.
Для меня проблема связана с тем, существует ли цель символической ссылки в момент времени, когда вы пытаетесь удалить символическую ссылку. Если цель существует, она работает. Если цель не существует, удалить символическую ссылку не удастся.
$ 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
Тот же тест, выполняемый в локальной файловой системе, работает нормально (т. Е. Неработающую символическую ссылку можно успешно удалить).
Мой клиент CIFS - это CentOS 7, использующий пакет cifs-utils. Эта CentOS является гостем VirtualBox на хосте Windows 7, но это не имеет значения, потому что в этом сценарии виртуализируется сетевое устройство, а не файловая система или устройство хранения.
Мой сервер CIFS - это устройство Synology NAS с DSM 5.2, с поддержкой символьных ссылок, включенной в его параметрах CIFS / SMB.
-> Могут ли другие люди подтвердить это поведение? -> Любое объяснение?
Энди