Допустим, у меня есть /var/log/nginx
защищенная папка (принадлежит root, и никто другой не может читать или писать в нее). Даже используя sudo, я не могу обойтись sudo rm -f /var/log/nginx/ab*
без сообщения "Нет такого файла или каталога". Нужно ли мне загружать оболочку root, чтобы сделать это, или есть какой-то другой способ?
решение1
Причина
Оболочка интерпретирует и расширяет любые символы glob (подстановочные знаки), такие как звездочка. Эта интерпретация команды происходит в текущей оболочке (до sudo
выполнения команды), которая не имеет разрешения на чтение каталога. Поскольку текущая оболочка не может найти файлы, соответствующие шаблону glob, расширение имени пути не выполняется, и оболочка передает rm
, -f
и /var/log/nginx/ab*
(с буквальным символом звездочка) в качестве аргументов команды sudo
.
Команда sudo
, в свою очередь, запускает rm
команду, которая пытается удалить файл с путем /var/log/nginx/ab*
(звездочка является допустимым символом для имени файла Unix). Поскольку такой файл на самом деле не существует, она сообщает о своей неудаче. В GNU rm
это сообщение об ошибке явное;полныйСообщение об ошибке ниже указывает на то, что удаляемый (отдельный) файл не существует:
rm: cannot remove `/var/log/nginx/ab*': No such file or directory
Решение
Решение состоит в запуске новой оболочки от имени суперпользователя с необходимыми разрешениями для выполнения расширения имени файла:
sudo bash -c "rm -f /var/log/nginx/ab*"
Приведенная выше команда запускает новую оболочку, которая запускается как root, а -c
опция используется для передачи команды, которая будет запущена оболочкой. Поскольку команда заключена в кавычки, звездочка не интерпретируется текущей оболочкой и передается как есть в новую оболочку root, позволяя ей расширить пути перед запуском команды rm
.
решение2
Проблема либо в именах файлов, либо в наличии пробелов в именах файлов.
Поэтому попробуйте следующие обходные пути:
Попробуйте использовать предыдущее
--
, чтобы обозначить конец вариантов, например:sudo rm -vf -- /var/log/nginx/ab*
Использовать
find
:sudo find /var/log/nginx -name "ab*" -print -delete
Если вы считаете, что ваши файлы защищены в Linux, попробуйте сначала снять защиту:
chattr -i ab*