Qual é o verdadeiro ponto da opção -f no rm?

10

Ao ler a página man do GNU coreutils para rm , uma das opções é -f , que, de acordo com o manual,

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

Agora, fiz alguns testes e mostro que, de fato, se eu usar algo como

rm -f /nonexisting/directory/

não vai reclamar.

O que alguém pode realmente ganhar com essa opção?

Além disso, os exemplos mais comuns de "exclusão de diretórios" usando rm são algo como

 rm -rf /delete/this/dir

A opção -r faz sentido, mas -f ?

    
por saliarosaurus 31.08.2013 / 04:04

3 respostas

8

Eu acho que a página man falta um pequeno detalhe neste caso. A opção -f de rm na verdade tem alguns casos de uso:

  • Para evitar um código de saída de erro
  • Para evitar ser solicitado
  • Para ignorar verificações de permissão

Você está certo de que é inútil remover um arquivo inexistente, mas em scripts é realmente conveniente dizer "Não quero esses arquivos, excluí-los se você os encontrar, mas não me incomoda se eles não existem ". Algumas pessoas usam o set -e em seu script para que ele pare em qualquer erro (para evitar mais danos que o script possa causar), e rm -rf /home/my/garbage é mais fácil do que if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi .

Uma nota sobre verificações de permissão: para excluir um arquivo, você precisa de permissão de gravação no diretório pai , não no próprio arquivo. Então, digamos que, de alguma forma, existe um arquivo de propriedade de root em seu diretório inicial e você não tem sudo access, você ainda pode remover o arquivo usando a opção -f . Se você usar o Git, verá que o Git não deixa a permissão de gravação nos arquivos de objeto que ele cria:

-r--r--r-- 1 phunehehe phunehehe 62 Aug 31 15:08 testdir/.git/objects/7e/70e8a2a874283163c63d61900b8ba173e5a83c

Portanto, se você usar rm , a única maneira de excluir um repositório Git sem usar root é usar rm -rf .

    
por 31.08.2013 / 10:13
4

A opção -f suprime os prompts de confirmação ao excluir um arquivo somente leitura. Também suprime erros quando um ou mais arquivos fornecidos não existem.

A opção -f é útil quando você está ciente de que alguns dos arquivos que você está excluindo podem ser somente leitura e você não quer ser alertado sobre isso.

A opção f também é útil quando você deseja remover alguns arquivos, caso eles existam, e não quer se importar se eles existem ou não. Isso é muito comumente usado em makefiles , para criar um comando que remova arquivos que podem ser regenerados a partir de arquivos de origem. Por exemplo, se foo.o puder ser recriado a partir de foo.c , bar.o poderá ser recriado a partir de bar.c e myapp poderá ser recriado a partir de foo.o e bar.o , então o destino makefile

clean:
        rm -f *.o myapp

remove myapp , foo.o e bar.o se eles existirem e não reclama se algum deles não existir.

A inclusão de -f nas instruções para remover uma árvore de diretórios não é necessária na maioria dos casos. Isso pode ser justificado porque, se você tiver certeza de que deseja remover essa árvore de diretórios, independentemente do conteúdo, especifique -f para evitar ser solicitado, caso alguns arquivos sejam somente leitura. No entanto, as pessoas que dizem para executar rm -rf geralmente repetem um encantamento místico para se livrar de algo, independentemente de as opções -r e -f serem realmente necessárias. Se as opções não forem necessárias, elas não são aconselháveis, porque aumentam o risco de que um erro de digitação no argumento destrua algo importante.

    
por 01.09.2013 / 23:26
3

A -i muda para rm

Eu geralmente vejo o -f sendo usado com rm quando o comando rm é com alias, de modo que inclua a opção -i para interativo. A opção -f neutraliza o -i .

Exemplo

Simule o problema com rm sendo aliases para rm -i .

$ alias rm='rm -i'

Crie alguns dados falsos

$ touch afile

Agora tente excluí-lo usando a versão aliases de rm

$ rm afile 
rm: remove regular empty file 'afile'?

Agora tente usar -f

$ rm -f afile 
$

Permissões

Além disso, acredito que há casos em que você tem acesso somente leitura a um diretório e quando você tenta excluir os arquivos e / ou subdiretórios no diretório, você será desafiado com um aviso semelhante de "tem certeza?" ". O uso de -f se livra de ter que dizer sim.

    
por 31.08.2013 / 04:15