Como impedir que a rm relate que um arquivo não foi encontrado?

155

Estou usando rmdentro de um script BASH para excluir muitos arquivos. Às vezes, os arquivos não estão presentes, por isso relata muitos erros. Eu não preciso dessa mensagem. Eu procurei na página de manual por um comando para rmsilenciar, mas a única opção que encontrei é a -fque, a partir da descrição, "ignora arquivos inexistentes, nunca solicita", parece ser a escolha certa, mas o nome não parece se encaixar , por isso estou preocupado que possa ter consequências não intencionais.

  • A -fopção é a maneira correta de silenciar rm? Por que não é chamado -q?
  • Esta opção faz mais alguma coisa?
Vila
fonte
4
você não deseja usar -f, ele remove o arquivo que você marcou como somente leitura.
pizza

Respostas:

209

O principal uso de -fé forçar a remoção de arquivos que não seriam removidos rmpor si só (como um caso especial, ele "remove" arquivos inexistentes, suprimindo a mensagem de erro).

Você também pode redirecionar a mensagem de erro usando

$ rm file.txt 2> /dev/null

(ou o equivalente do seu sistema operacional). Você pode verificar o valor $? imediatamente após ligar rmpara ver se um arquivo foi realmente removido ou não.

chepner
fonte
3
--fé válido para o GNU Coreutils rm, mas apenas porque é uma abreviação exclusiva para --force. A forma abreviada -fé mais clara e mais portátil.
Keith Thompson
Não tenho certeza se percebi isso. --faqui está apenas um erro de digitação -f.
chepner 28/05
2
o que os 2 in 2>fazem?
Dan
@Maverick Ele redireciona todas as mensagens enviadas ao stderr para / dev / null em vez de enviá-las para o terminal.
Benjamin Nolan
73

Sim, -fé a opção mais adequada para isso.

Satya
fonte
Alguns sistemas solicitarão que você ative mesmo com -f até usar a barra invertida.
vimdude
11
@ vimdude: Não são "alguns sistemas"; esse comportamento indica que você tem uma função de shell ou alias que mapeia rmpara rm -i.
Keith Thompson
28

-f é o sinalizador correto, mas para o operador de teste, não rm

[ -f "$THEFILE" ] && rm "$THEFILE"

isso garante que o arquivo exista e seja um arquivo regular (não um diretório, nó do dispositivo etc ...)

technosaurus
fonte
4
No entanto, isso tem uma condição de corrida e não deve ser usado em scripts de produção.
Tripleee
Acredito que o @tripleee está apontando é que o teste "-f" e a remoção do arquivo podem ser concluídos em qualquer ordem. Outra maneira de fazer isso é if [ -f "$THEFILE" ]; then rm "$THEFILE"; fi:, que torna as etapas de teste e remoção de arquivo explicitamente seqüenciais.
Robla
2
@robla esse código faz exatamente a mesma coisa com uma sintaxe mais detalhada ... &&! = & ... O teste sempre acontece antes da rm, mas um processo separado pode tecnicamente (embora muito improvável) excluí-lo antes que a rm seja executada (enquanto o shell código após o teste estar sendo interpretado).
technosaurus
technosaurus - oops, você está certo. Qual é a melhor resposta para a pergunta de @ mmlac?
Robla
3
E apenas para confirmar, a condição de corrida é que algo pode remover o arquivo entre teste rm. Não há como rmexecutar antes testaqui. Observar antes de saltar é um erro comum na programação simultânea - você não pode mais confiar no resultado da "aparência" quando realmente "salta"; a solução para isso é usar operações atômicas ou de bloqueio. É exatamente por isso que você deseja rm -f, que é um exemplo do último.
Tripleee
13

\rm -f file nunca reportará não encontrado.

vimdude
fonte
4
O -r é desnecessário e perigoso.
mahemoff
1
Eu assumi muitos arquivos ou diretórios. Releia a solicitação do usuário e você está certo de que ele estava solicitando apenas arquivos. Então corrigido minha resposta
vimdude
Qual é a barra invertida antes do rm fazer? por favor pessoal, preciso de uma resposta para isso. No Windows, o cygwin's make versão 4.1 não pode lidar com \ rm enquanto o 3.75 funciona bem.
Ayman Salah
2
@AymanSalah A barra invertida nesse contexto escaparia a qualquer função ou apelido que envolvesse o real rm(como era popular em alguns sites no início dos anos 90 para impedir que iniciantes removessem coisas e depois chamassem o administrador do sistema para recuperar seus arquivos).
Tripleee
Obrigado - isso resolveu meu problema .. aparentemente o código de saída permite encadear usando &&while sem -f ele quebra quando o arquivo não é encontrado.
Igor
5

Na medida em que rm -ffaz "qualquer outra coisa", força ( -fé uma abreviação de --force) remoção silenciosa em situações em rmque, de outra forma, solicitava confirmação. Por exemplo, ao tentar remover um arquivo não gravável por você de um diretório gravável por você.

Idelic
fonte
-9

Eu tive o mesmo problema para cshell. A única solução que tive foi criar um arquivo fictício que correspondesse ao padrão antes de "rm" no meu script.

Niranjan
fonte
7
Essa foi realmente a única solução? Você tentou rm -fou rm filename >&/dev/null?
Keith Thompson