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

14

Lendo a página de manual do GNU coreutils 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 rmsão algo como

 rm -rf /delete/this/dir

A -ropção faz sentido, mas -f?

saliarosaurus
fonte

Respostas:

9

Acho que a página de manual carece de um pequeno detalhe neste caso. A -fopção de rmrealmente tem alguns casos de uso:

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

Você está certo que não faz sentido remover um arquivo inexistente, mas nos scripts é realmente conveniente poder dizer "Eu não quero esses arquivos, exclua-os se você os encontrar, mas não me incomode se eles não existe ". Algumas pessoas usam o set -escript em seu script para que ele pare com qualquer erro (para evitar mais danos que o script possa causar) e rm -rf /home/my/garbageseja mais fácil do que isso if [[ -f /home/my/garbage ]]; then rm -r /home/my/garbage; fi.

Uma observação sobre as verificações de permissão: para excluir um arquivo, você precisa de permissão de gravação no diretório pai , não no arquivo em si. Então, digamos que, de alguma forma, exista um arquivo pertencente ao rootseu diretório pessoal e você não tenha sudoacesso, você ainda pode remover o arquivo usando a -fopção Se você usa o Git, pode 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.

phunehehe
fonte
4
-fnão evita um código de saída de erro. Se rmtentar e não conseguir remover um arquivo existente, ele retornará um código de erro.
Gilles 'SO- stop be evil' em
Eu diminuí a votação desta resposta porque "Para evitar um código de saída de erro" deve ser escrito como "Para evitar um código de saída de erro no caso de não haver operandos de arquivo ou que não existam operandos de arquivo". Como esta resposta está escrita agora, está errada.
Harold Fischer
6

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

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

A fopção também é útil quando você deseja remover alguns arquivos, caso existam, e não quer se importar se eles existem ou não. Isso é muito usado em makefiles , para criar um comando que remove arquivos que podem ser regenerados dos arquivos de origem. Por exemplo, se foo.opode ser reconstruído de foo.c, bar.opode ser reconstruído de bar.ce myapppode ser reconstruído de foo.oe bar.o, em seguida, o destino do makefile

clean:
        rm -f *.o myapp

remove e myapp, se existirem, e não reclamar, se algum deles não existir.foo.obar.o

Incluir -fnas instruções para remover uma árvore de diretórios não é necessário na maioria dos casos. Isso pode ser justificado porque, se você tiver certeza de que deseja remover essa árvore de diretórios, independentemente do que está nela, poderá especificar -fpara evitar ser avisado caso alguns arquivos sejam somente leitura. No entanto, as pessoas que dizem que a corrida rm -rfsão muitas vezes apenas repetindo um encantamento místico para se livrar de algo, não importando se as opções -re -fsão realmente necessárias. Se as opções não forem necessárias, não são aconselháveis, porque aumentam o risco de um erro de digitação no argumento destruir algo importante.

Gilles 'SO- parar de ser mau'
fonte
3

A -imudança pararm

Geralmente, vejo o -fuso rmquando o rmcomando é aliasado, de modo a incluir a -iopção de interativo. O -finterruptor neutraliza o -i.

Exemplo

Simule o problema com rmaliases para rm -i.

$ alias rm='rm -i'

Faça alguns dados falsos

$ touch afile

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

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

Agora tente usar -f

$ rm -f afile 
$

Permissões

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

slm
fonte
Ao usar o alias, faz algum sentido. E sua resposta corresponde ao que eu apenas mostro nas páginas do manual do openbsd. Embora o openbsd não seja GNU / Linux, parece que descreve o que você acabou de dizer. Aqui está o link, se alguém gostaria de verificar: [link] openbsd.org/cgi-bin/...
saliarosaurus
Com o bash, você sempre pode \rmexecutar para executar sem alias (\ sendo um atalho para a commandconstrução). Acho que o melhor uso -fé no script de shell, onde você tem algo como um arquivo de bloqueio que pode ou não existir, -finterrompe o rm: cannot remove 'file': No such file or directoryaviso.
Drav Sloan
@DravSloan Sim, isso também faz sentido. Obrigado por suas respostas, Drav Sloan e slm
saliarosaurus
Eu uso rm -ffrequentemente no cleanalvo em Makefiles #
318/08 Alex
-inão é realmente o que -fse trata, é mais um caso de ponta.
Gilles 'SO- stop be evil' em