LINUX.ORG.RU

rm: cannot remove `dir': Is a directory

 ,


0

2

Чую, что какая-то страшная глупость, но что-то не придумывается. rm -f dir/* на пустом каталоге работает нормально (т.е. ничего не делает и не выдает ошибок) на локальной ФС, а на смонтированной шаре выдает сабжевую ошибку. Монтирутся с дефолтными опциями, ничего путного в мане mount.cifs не нашел. Двойные кавычки не помогают.

(/backup/nas/ - самба-шара)
[root@server ~]# mkdir /backup/nas/dir
[root@server ~]# touch /backup/nas/dir/file1
[root@server ~]# rm -f /backup/nas/dir/*
[root@server ~]# rm -f /backup/nas/dir/*
rm: cannot remove `/backup/nas/dir/*': Is a directory
[root@server ~]# mkdir /root/dir
[root@server ~]# touch /root/dir/file1
[root@server ~]# rm -f /root/dir/*
[root@server ~]# rm -f /root/dir/*
[root@server ~]# 

Кто виноват и что делать?


А цель операции какая? Удалять файлы если они есть и не получать ошибку?

Можно например так:

if [ -f /dir/* ]; then
 rm -f /dir/*
fi

asve79 ()

Удалять каталоги, а которых есть файлы приписывая ключ -r к rm. В твоем случае cd /backup/nas/ ; rm -rf dir (я больше люблю такой вариант, во избежании ошибок).
Пустые каталоги с помощью rmdir
Пробуй

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от asve79

Да, цель такая. Понятно, что есть миллион вариантов, как это сделать, просто интересно, почему так происходит.

gaga ()

Кто виноват

ты

и что делать?

man rm

anonymous ()

man rm говорит следующее:

По умолчанию каталоги не удаляются, но если заданы опции -r или -R, то будет удаляться все дерево каталогов ниже заданного каталога, включая и его самого (без ограничения на глубину этого дерева).

-r, -R - Рекурсивно удалять содержимое каталогов.

Используй рекурсивное удаление каталогов:

rm -rf /backup/nas/dir/*

А вообще ты юморист - обычно бэкапы хранят и берегут, а ты удаляешь. :)

anonymous ()
Ответ на: комментарий от gaga

интересно, почему так происходит

Исходники у тебя в руках - действуй!

anonymous ()

Если интерестно разобратся что происходит, сделайте:

″strace rm -f /backup/nas/dir/*″

и посмотрите, вызывает ли ″rm″ системный вызов unlink() или unlinkat() и с какими аргументами. Подозреваю, что проблема в том, что «*» (звёздочка) не является допустимым в имени файла в случае smb файловой системы.

mky ★★★★★ ()
Ответ на: комментарий от mky

Да, любопытные вещи вырисовываются. Как я понял, происходит следующее: перед собственно удалением rm делает statat файла, чтобы проверить не директорий ли это часом.

Поскольку каталог, в котором я удаляю файлы, пустой, баш не подставляет звездочку и передает как есть в fstatat. Т.к. файла с таким именем нет, fstat возвращает ошибку, на которую rm кладет болт, вызывает unlinkat, который также завершается с ошибкой, которая также молча игнорируется, и rm выходит.

fstatat64(AT_FDCWD, "/root/dir/*", 0x8fc2ab0, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)
unlinkat(AT_FDCWD, "/root/dir/*", 0)    = -1 ENOENT (No such file or directory)

A на самбе fstat почему-то работает так, как будто звездочки нет, показывая данные для /backup/nas/dir/. Т.к. флага -R нету, rm выходит с ошибкой, что не может удалить каталог. Вопрос теперь какого хера cifs игнорирует звездочку?

fstatat64(AT_FDCWD, "/backup/nas/dir/*", {st_mode=S_IFDIR|0777, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
gaga ()
Ответ на: комментарий от gaga

Особо ничем помочь не могу, разве что ещё раз повторю, что символы «*?<>|:» запрещены в именах файлов в windows и не должны встречатся в SMB. Причём, в README от cifs указано, что как клиент, так и сервер может сделать remap этих символов. У cifs есть опции ″mapchars″, ″posixpaths″, ″noposixpaths″.

Так даже не понятно, клиент или ваш NAS даёт неправильный ответ на fstatat64().

mky ★★★★★ ()
Ответ на: комментарий от mky

Ну да, особо ничего не поделать тут, скорее всего. Но поскольку в скрипте это легко обходится, то и ладушки. Спасибо!

gaga ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.