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

0

Do manual:

  • -f, --force

    ignora arquivos inexistentes, nunca solicita

  • -r, -R, --recursivo

    remova o conteúdo dos diretórios recursivamente

Embora essa descrição de opções seja diferente, ao tentar excluir uma pasta vazia (sem rmdir para este exemplo), ela fornece o mesmo resultado.

-f não imprime erro ou nada comparado a -r , essa é a única diferença ou existe um tipo específico de situações em que uma opção é melhor que outra ou situações em que uma dessas opções simplesmente não será trabalhar enquanto o outro vai?

    
por Cerberussian 20.09.2016 / 09:15

2 respostas

2

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

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

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

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

-r

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

-f

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

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

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

Eu habilitei o detalhamento e o modo interativo por padrão para esses exemplos. Algumas distros fazem isso enquanto outras não.

exemplo de rm

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

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

rm example -f

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

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

rm example -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, a permissão para cada arquivo e diretório é solicitada, os arquivos ocultos também são removidos.

exemplo rm / * -f

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

Aqui, você não precisa de permissão, os diretórios não são excluídos e nem os arquivos ocultos.

exemplo rm / * -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 próprio diretório) é removido, incluindo arquivos ocultos.

    
por 20.09.2016 / 09:21
0

rm -r mydir removerá o diretório mydir com todo o seu conteúdo.

rm -f mydir não removerá um diretório (nem vazio nem com conteúdo). Ele relatará 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 comando rm se comportar independentemente dos argumentos dados (do mais provável para o menos provável):

  1. você tem um alias de shell rm defined e passa alguns parâmetros definidos (como -r ) para o comando rm
  2. você está chamando um script chamado rm , que também passa parâmetros adicionais para o comando real
  3. você tem um personalizado rm executável

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

    
por 20.09.2016 / 09:29

Tags