O rm -rf * exclui arquivos recursivamente do diretório atual ou diretório pai / raiz?

7

Eu queria excluir arquivos e pastas de forma recursiva de uma determinada pasta, por isso executei esse comando nessa pasta

rm -rf *

Eu assumi que excluiria todos os arquivos / diretórios no diretório atual recursivamente. Algo ruim aconteceu depois disso (meu servidor está inoperante, nem mesmo recebendo resposta de ping).

    
por Windows 20.12.2013 / 12:17

1 resposta

11

Não se esqueça da possibilidade de o servidor estar inacessível após o comando rm não ter nada a ver com isso. Pode ser uma coincidência!

O mais provável é que o diretório de trabalho atual não tenha sido o que você pensou, quando o comando foi emitido.

Você estava zangado ao fazer isso?

Isso é o que acontece ao emitir o comando rm -rf * :

  1. O shell resolve os padrões de curinga ( * neste caso) para todos os arquivos (incluindo diretórios, links simbólicos e arquivos especiais de dispositivo) que correspondam ao padrão de globbing usado, neste caso tudo não começando com . Normalmente , estes são classificados "alfabeticamente" pelo shell.
  2. O shell então bifurca um novo processo e exec() s a primeira versão de rm encontrada em seu $PATH , com -rf como o primeiro argumento e os arquivos correspondentes, um por um como os argumentos consecutivos .

Se o rm que foi invocado for o comando rm padrão, ele primeiro analisa os argumentos, um por um, tratando todos os argumentos (incluindo os resultantes da globalização shell) que começam com - como opções até chega-se a um argumento que não começa com - (exceto para comandos usando GNU getopt() que aceitam opções após não-opções), ou um que é exatamente -- . Tudo depois disso é considerado nomes de arquivos.

Em outras palavras, se você tivesse um arquivo chamado (por exemplo) --no-preserve-root no diretório atual, isso seria interpretado como uma opção para rm , não como um nome de arquivo para remover!

Tenha cuidado com os curingas (e com a nomeação de arquivos). Se você tiver um arquivo chamado -r no diretório atual, o comando ls * listaria os outros arquivos na ordem inversa e não mostraria o arquivo '-r'.

Em outras palavras, se você tivesse um arquivo chamado --no-preserve-root , isso seria passado como uma opção para rm , não como um nome de arquivo.

Use rm -rf -- * para evitar que isso aconteça e remova os arquivos que começam com - . Ou simplesmente use nomes de caminho absolutos ou relativos para fazer com que os nomes de arquivos comecem com algo diferente de - , como em: rm ./--flagfile ou rm /abs/path/to/--flagfile .

Existe também um sinal -i para rm que faz com que seja solicitado ("interativamente") antes de remover qualquer coisa.

    
por 20.12.2013 / 12:46

Tags