Qual é a diferença entre rm -r e rm -f?

Qual é a diferença entre rm -r e rm -f?

Do manual:

  • -f, --força

    ignore arquivos inexistentes, nunca avise

  • -r, -R, --recursivo

    remova o conteúdo dos diretórios recursivamente

Embora a descrição desta opção seja diferente, ao tentar excluir uma pasta vazia (sem rmdir para este exemplo) dá o mesmo resultado.

-fnão imprimirá erro nem nada comparado a -r, essa é a única diferença ou existe um tipo específico de situação em que uma opção é melhor que outra ou situações em que uma dessas opções simplesmente não funciona enquanto a outra funciona?

Responder1

Isto é o que diz a página de manual do CentOS:

-f, --force
    ignore nonexistent files, never prompt

-r, -R, --recursive
    remove directories and their contents recursively

Pelo que percebi (graças a alguns comentários abaixo), o seguinte é verdadeiro para os sinalizadores -re :-f

-r

  • exclui recursivamente o conteúdo de um diretório, incluindo arquivos ocultos e subdiretórios
  • dependendo da sua configuração, pode pedir permissão (por exemplo, ao usar o --interactivesinalizador). Algumas distribuições fazem isso por padrão.
  • pode ser usado para remover um diretório, se você quiser fazer isso, basta fornecer o caminho do diretório (por exemplo: /path/to/directory)

-f

  • não exclui recursivamente o conteúdo de um diretório, apenas remove os arquivos que correspondem diretamente ao caminho fornecido (por exemplo example/file1ou example/*).
  • Nunca exclui subdiretórios
  • Nunca pede permissão, basicamente yes to allno Windows

Abaixo estão alguns exemplos, todos eles começam com a seguinte estrutura:

example/
  file1
  file2
  file3
  .file
  dir/
    file1
    file2
    file3
    .file

Ativei a verbosidade e o modo interativo por padrão para esses exemplos. Algumas distros fazem isso, enquanto outras não.

exemplo de empresa

$ rm example
rm: cannot remove `example': Is a directory

Como você pode ver, rmnão remove diretórios por padrão.

exemplo de rm -f

$ rm example -f
rm: cannot remove `example': Is a directory

Usar o -fsinalizador ainda não permite a remoção de diretórios.

exemplo de rm -r

$ rm example -r
rm: descend into directory `example'? yes
rm: remove regular empty file `example/file3'? yes
  removed `example/file3'
rm: remove regular empty file `example/file2'? yes
  removed `example/file2'
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
  removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
  removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
  removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
  removed `example/dir/file1'
rm: remove directory `example/dir'? yes
  removed directory: `example/dir'
rm: remove regular empty file `example/file1'? yes
  removed `example/file1'
rm: remove directory `example'? yes
  removed directory: `example'

Como você pode ver, é solicitada permissão para cada arquivo e diretório; os arquivos ocultos também são removidos.

rm exemplo/* -f

$ rm example/* -f
rm: cannot remove `example/dir': Is a directory
removed `example/file1'
removed `example/file2'
removed `example/file3'

Aqui, não é solicitada permissão, os diretórios não são excluídos e nem os arquivos ocultos.

rm exemplo/* -r

$ rm example/* -r
rm: descend into directory `example/dir'? yes
rm: remove regular empty file `example/dir/.file'? yes
  removed `example/dir/.file'
rm: remove regular empty file `example/dir/file3'? yes
  removed `example/dir/file3'
rm: remove regular empty file `example/dir/file2'? yes
  removed `example/dir/file2'
rm: remove regular empty file `example/dir/file1'? yes
  removed `example/dir/file1'
rm: remove directory `example/dir'? yes
  removed directory: `example/dir'
rm: remove regular empty file `example/.file'? yes
  removed `example/file'
rm: remove regular empty file `example/file1'? yes
  removed `example/file1'
rm: remove regular empty file `example/file2'? yes
  removed `example/file2'
rm: remove regular empty file `example/file3'? yes
  removed `example/file3'

Aqui, o conteúdo do diretório de exemplo (não o diretório em si) é removido, incluindo arquivos ocultos.

Responder2

rm -r mydirremoverá o mydirdiretório com todo o seu conteúdo.

rm -f mydirnão removerá um diretório (nem vazio nem com conteúdo). Ele reportará um erro:

  • no BSD/OS X:

    rm: mydir/: is a directory
    
  • no GNU/Linux:

    rm: cannot remove 'mydir': Is a directory
    

Possíveis explicações para o rmcomando se comportar independentemente dos argumentos fornecidos (do mais ao menos provável):

  1. você tem um alias de shell rmdefinido e ele passa alguns parâmetros definidos (como -r) para o rmcomando
  2. você está chamando um script chamado rmque também passa parâmetros adicionais para o comando real
  3. você tem um rmexecutável personalizado

Você pode verificar as duas primeiras possibilidades executando /bin/rm -f mydir.

informação relacionada