A rm não informou quando um arquivo está faltando?

38

Eu tenho um script bash que desejo remover arquivos de vários diretórios. Freqüentemente, eles não estarão lá porque não foram gerados e isso é bom. Existe uma maneira de obter o script para não relatar esse erro, mas se a rm tiver alguma outra saída para relatar isso?

Como alternativa, existe um comando melhor para remover o arquivo menos barulhento?

flickerfly
fonte

Respostas:

66

Use a -fopção Ele ignorará silenciosamente arquivos inexistentes.

De man rm:

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

[A parte "nunca solicitar" significa que (a) -fsubstitui qualquer opção -iou -Iopção especificada anteriormente e (b) os arquivos protegidos contra gravação serão excluídos sem serem solicitados.]

Exemplo

Sem -f, rmirá reclamar sobre arquivos ausentes:

$ rm nonesuch
rm: cannot remove ‘nonesuch’: No such file or directory

Com -f, ficará em silêncio:

$ rm -f nonesuch
$
John1024
fonte
4
Oh, eu novo que não solicitou a remoção, não percebi que também ignorava os inexistentes. Eu pulei totalmente isso ao olhar para o homem. :-) Obrigado. Vou marcar isso como resposta assim que for permitido.
Flickerfly 29/04
9

Se o seu requisito é que rmnão se queixe de arquivos ausentes, mas que você também queira obter outra saída rm, minha sugestão seria primeiro testar a existência do arquivo de destino e chamar rm( sem o -fsinalizador) se o arquivo realmente existe.

# rest of script
# ...
[ -e "$file" ] && rm "$file"
# ...
# rest of script

A chamada rm -fde um arquivo que, por exemplo, não possui permissões de gravação do usuário, removerá o arquivo e também não emitirá o prompt normal para esse cenário.

Caso você queira usar a mesma idéia com vários arquivos, eu criaria uma definição de função, como:

qrm() {
  for f
  do
    [ -e "$f" ] && rm "$f"
  done
}

Use-o como: qrm file1 file2-does-not-exist *.txt etc here

Jeff Schaller
fonte
1
Vale a pena conhecer a chance muito pequena de uma condição de corrida em que o arquivo é excluído (ou criado) entre o teste e a remoção, mas não consigo imaginar isso relevante em qualquer situação típica em que alguém usaria um shell script .
David Z
7

Você afirmou que ainda deseja ver outra saída do rmcomando ao executá-lo, mas o uso da -fopção suprimirá esses itens. Você precisará filtrar o STDERR pelo que deseja, o que é um pouco complicado, pois você deseja que todo o resto seja exibido.

Você vai querer usar um comando como este:

rm -f filename 3>&1 1>&2 2>&3 3>&- | grep -v 'No such file or directory'

Comando explicado:

  • -f argumento é forçar e não solicitar confirmação ou erros
  • 3>&1 1>&2 2>&3 3>&-é alternar entre STDOUT e STDERR para filtragem (você pode ler mais sobre isso aqui, se quiser
  • | grep -v 'No such file or directory' está filtrando a mensagem que você não deseja ver

Agora, se você quiser suprimir totalmente as mensagens de erro, execute o seguinte comando:

rm filename 2> /dev/null

Este comando redireciona STDERR para / dev / null, para que você não o veja quando executar o comando.

BriGuy
fonte
1
(AFAICS) rmsem -vnunca mais saídas para stdout, apenas a stderr, portanto, neste caso, você poderia apenas 2>&1 | grepsem a dança que é útil em termos mais gerais,
dave_thompson_085
4

Como alternativa, você pode usar o findcomando com a -deleteopção Isso (obviamente) excluirá apenas os arquivos encontrados, para que nunca avise se não houver. Um exemplo pode ser:

find /var/log/triffids/ -name "*.log" -mtime 30 -delete

que pesquisaria o /var/log/triffids/diretório e excluiria todos os arquivos com o .logsufixo que não foram modificados por mais de 30 dias.

É sempre uma boa idéia executar esses comandos sem a -deleteopção primeiro, para garantir que ele encontre os arquivos que você espera.

seumasmac
fonte
Eu gosto dessa opção e considerarei uma alteração. Obrigado por compartilhar.
flickerfly
3

Marque a opção --force( -f) de rm:

-f, --force

ignore arquivos e argumentos inexistentes, nunca solicite

heemail
fonte
2

Isso é um truque, mas você sempre pode touchremover o arquivo. Se não existir, será criado para rmremovê-lo.

matega
fonte
Gosto disso, exceto pelo desempenho - qual o custo de tocar vários Ks de arquivos em vez de excluir apenas aqueles que não existem?
11556 Dani_l
0

Você pode usar -fcomo quiser, de acordo com a página de manual:

Tente remover os arquivos sem solicitar confirmação, independentemente das permissões do arquivo. Se o arquivo não existir, não exiba uma mensagem de diagnóstico ou modifique o status de saída para refletir um erro. Lembre-se também de que a opção -f substitui as opções -i anteriores.

rm -f xyz-directory

não solicitará nada e fará exatamente o que você deseja.

Ankit Jain
fonte
-1

Existem duas maneiras principais: se você adicionar a opção -f, ela não mostrará o erro "não existe" e duas: (funciona para quase qualquer comando) em vez de apenas executar o "comando" do "comando 2> / dev / null "onde" o comando "é o comando que você está executando.

John
fonte
1
Eu estava evitando a tubulação porque não quero perder outros erros que possam surgir. Eu não sei o que eles seriam.
Flickerfly 29/04