Digamos que eu tenha uma pasta /var/log/nginx
protegida (de propriedade do root e ninguém mais pode ler ou escrever nela). Mesmo usando o sudo, não consigo ficar sudo rm -f /var/log/nginx/ab*
sem "Esse arquivo ou diretório não existe". Preciso realmente carregar um shell root para fazer isso ou existe alguma outra maneira?
Responder1
Causa
O shell interpreta e expande quaisquer caracteres glob (curingas), como o asterisco. Esta interpretação do comando acontece no shell atual (antes da sudo
execução do comando) que não possui permissão de leitura para o diretório. Como o shell atual não consegue encontrar arquivos que correspondam ao padrão glob, a expansão do nome do caminho não é executada e o shell passa rm
, -f
e /var/log/nginx/ab*
(com um asterisco literal) como argumentos para o sudo
comando.
O sudo
comando, por sua vez, inicia o rm
comando que tenta remover um arquivo com caminho de /var/log/nginx/ab*
(um asterisco é um caractere legal para um nome de arquivo Unix). Como esse arquivo não existe de fato, ele relata sua falha. Com GNU rm
, esta mensagem de erro é explícita; ocompletoa mensagem de erro abaixo indica que o arquivo (único) que está sendo removido não existe:
rm: cannot remove `/var/log/nginx/ab*': No such file or directory
Solução
A solução é lançar um novo shell como superusuário com as permissões necessárias para realizar a expansão do nome do arquivo:
sudo bash -c "rm -f /var/log/nginx/ab*"
O comando acima inicia um novo shell que é executado como root e a -c
opção é usada para passar o comando a ser executado pelo shell. Como o comando está entre aspas, o asterisco não é interpretado pelo shell atual e é passado como está para o novo shell raiz, permitindo expandir os nomes dos caminhos antes de iniciar o rm
comando.
Responder2
É um problema com os nomes dos arquivos ou possíveis espaços nos nomes dos arquivos.
Portanto, tente as seguintes soluções alternativas:
Tente preceder
--
para indicar o fim das opções, por exemplo:sudo rm -vf -- /var/log/nginx/ab*
Usar
find
:sudo find /var/log/nginx -name "ab*" -print -delete
Se você acha que seus arquivos estão protegidos no Linux, tente primeiro remover a proteção:
chattr -i ab*