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.
-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.
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.
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.
-f
não evita um código de saída de erro. Serm
tentar e não conseguir remover um arquivo existente, ele retornará um código de erro.A
-f
opçã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
-f
opçã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
f
opçã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, sefoo.o
pode ser reconstruído defoo.c
,bar.o
pode ser reconstruído debar.c
emyapp
pode ser reconstruído defoo.o
ebar.o
, em seguida, o destino do makefileremove e
myapp
, se existirem, e não reclamar, se algum deles não existir.foo.o
bar.o
Incluir
-f
nas 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-f
para evitar ser avisado caso alguns arquivos sejam somente leitura. No entanto, as pessoas que dizem que a corridarm -rf
são muitas vezes apenas repetindo um encantamento místico para se livrar de algo, não importando se as opções-r
e-f
sã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.fonte
A
-i
mudança pararm
Geralmente, vejo o
-f
usorm
quando orm
comando é aliasado, de modo a incluir a-i
opção de interativo. O-f
interruptor neutraliza o-i
.Exemplo
Simule o problema com
rm
aliases pararm -i
.Faça alguns dados falsos
Agora tente excluí-lo usando a versão de alias do
rm
Agora tente usar
-f
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
-f
se livra de ter que dizer sim.fonte
\rm
executar para executar sem alias (\ sendo um atalho para acommand
construçã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,-f
interrompe orm: cannot remove 'file': No such file or directory
aviso.rm -f
frequentemente noclean
alvo emMakefile
s #-i
não é realmente o que-f
se trata, é mais um caso de ponta.