Como eu faço rm não dar um erro se um arquivo não existe?

273

Estou escrevendo um makefile que irá limpar alguns arquivos inúteis no final da compilação. Se um alvo já foi feito, ele obviamente pulará esse alvo e o arquivo inútil pode não estar lá. Então, se eu fizer isso:

rm lexer.ml interpparse.ml interpparse.mli

Eu posso receber erros porque um dos arquivos não existe. Existe alguma maneira de informar rm para ignorar esses arquivos?

Ao ler a página man, vejo a seguinte opção:

 -f          Attempt to remove the files without prompting for confirma-
             tion, regardless of the file's permissions.  If the file does
             not exist, do not display a diagnostic message or modify the
             exit status to reflect an error.  The -f option overrides any
             previous -i options.

Isso soa como quase o que eu quero, mas não tenho certeza sobre a parte das permissões. Existe uma maneira de fazer isso?

    
por Jason Baker 27.11.2009 / 17:43

12 respostas

231

A opção -f é definitivamente o que você deseja usar.

A confirmação sobre as permissões de arquivo a que se refere é esta:

$ touch myfile    
$ chmod 400 myfile
$ rm myfile       
rm: remove write-protected regular empty file 'myfile'?

Portanto, rm avisará se você tentar excluir um arquivo no qual não tenha permissões de gravação. Isso é permitido se você tiver permissões de gravação no diretório, mas é um pouco estranho, e é por isso que rm normalmente avisa sobre isso.

    
por 27.11.2009 / 17:54
87

Outra solução é a seguinte: link

Basta adicionar uma instrução OR após o seu comando:

rm -rf my/dir || true

Desta forma, quando a declaração # 1 falhar (gera erro), execute a instrução # 2, que é simplesmente true .

    
por 09.03.2015 / 13:39
72

Estou muito atrasado para a festa, mas uso isso o tempo todo. Em um makefile, adicione - ao início de uma linha para ignorar o valor de retorno dessa linha. Assim:

-rm lexer.ml interpparse.ml interpparse.mli
    
por 24.12.2012 / 00:12
8

Se você não quiser usar a opção -f, uma alternativa é:

rm filethatdoesntexist 2> /dev/null 

Isso apenas evitará que os erros sejam impressos.

    
por 12.06.2012 / 21:46
7

Se você encontrar uma forma de glob os nomes dos arquivos, rm não reclamará se não consegue encontrar uma correspondência. Então, algo como lexer.m* interpparse.* , etc. deve funcionar para você (tenha cuidado para não excluir muito, é claro). Além disso, -f é uma maneira perfeitamente razoável de ir, contanto que você não esteja esperando que as permissões de arquivo evitem que você exclua um arquivo que você não queria - se você não quiser excluí-lo, don ' Coloque-o na lista.

    
por 27.11.2009 / 17:48
5

A opção -f significa que você não será perguntado se algo não for o esperado. Isso não significa que as permissões não sejam levadas em conta.

Se você não tiver privilégios suficientes para remover um arquivo, ele não será removido.

MAS , se você tiver privilégios suficientes para alterar os privilégios, seu arquivo será removido. Esse é o caso quando você é o proprietário de um arquivo com permissões de somente leitura para o proprietário (-r --------). Como proprietário, você pode chmod u+w e, em seguida, removê-lo: rm -f removerá esse arquivo.

    
por 27.11.2009 / 20:27
3

Talvez possa ajudar uma linha semelhante a:

touch fakefile.exe fakefile.o && rm *.o *.exe

Eu sei que isso não é muito inteligente, mas faz o trabalho.

    
por 11.03.2011 / 11:36
2

Uma alternativa:

RmIfIsFile() {  for f in "$@"; do [ -f $f ] && rm $f; done; };  RmIfIsFile lexer.ml interpparse.ml interpparse.mli

Pena que os Makefiles não podem compartilhar as definições das funções do shell nas linhas.

    
por 27.11.2009 / 18:44
2

Aqui está o que eu uso em scripts de shell. Ele oculta a mensagem de erro e o código de erro.

rm doesnotexist 2> /dev/null || echo > /dev/null
    
por 11.06.2015 / 15:55
0

você pode tocar nos arquivos antes de criá-los. que os criaria se eles não existissem: -)

touch lexer.ml interpparse.ml interpparse.mli
rm lexer.ml interpparse.ml interpparse.mli
    
por 02.02.2017 / 17:11
0

escreva rm -rf ppp>/dev/null 2>&1 você mais recente obter mensagem de erro Problema ocorre, se erro gerar não STDERR 2, mas STDOUT 1 ... Ele ocorre quando o comando gerar não erro, mas de aviso. Você precisa definir o filtro e remover esta mensagem. Mas esse caso é comum.

    
por 19.08.2017 / 11:47
0

teste para ver se o arquivo existe primeiro, se isso acontecer, então passe para rm. Então os erros do rm serão significativos. -f ou ignorar a mensagem de erro é tipicamente mais abrangente do que o que uma pessoa deseja. -f pode fazer coisas que você não quer fazer.

if [ -f lexer.ml ]; then
  rm lexer.ml
fi

adicione mais cláusulas de teste se houver mais arquivos que você queira ter certeza.

    
por 09.10.2018 / 17:08