Causa
O shell interpreta e expande todos os caracteres glob (curingas), como o asterisco. Essa interpretação do comando acontece no shell atual (antes da execução do comando sudo
), que não tem permissão de leitura para o diretório. Como o shell atual não pode encontrar arquivos que correspondam ao padrão glob, a expansão do nome de caminho não é executada e o shell passa rm
, -f
e /var/log/nginx/ab*
(com um asterisco literal) como os argumentos para o sudo
comando.
O comando sudo
, por sua vez, inicia o comando rm
, que tenta remover um arquivo com um caminho de /var/log/nginx/ab*
(um asterisco é um caractere legal para um nome de arquivo Unix). Como esse arquivo não existe, ele informa sua falha. Com o GNU rm
, esta mensagem de erro é explícita; a mensagem de erro completa 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 o superusuário com as permissões necessárias para executar 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 opção -c
é usada para passar o comando a ser executado pelo shell. Como o comando é citado, o asterisco não é interpretado pelo shell atual e é passado como está para o novo shell raiz, permitindo que ele expanda os nomes dos caminhos antes de iniciar o comando rm
.