O rm não reporta quando um arquivo está faltando?

16

Eu tenho um script bash que eu quero remover arquivos de vários diretórios. Freqüentemente, eles não estarão lá porque não foram gerados e tudo bem. Existe uma maneira de fazer com que o script não relate esse erro, mas se o rm tiver alguma outra saída para relatar isso?

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

    
por flickerfly 29.04.2016 / 20:40

8 respostas

35

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

De man rm :

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

[A parte "never prompt" significa que (a) -f substitui qualquer opção -i ou -I especificada anteriormente, e (b) os arquivos protegidos contra gravação serão excluídos sem perguntar.]

Exemplo

Sem -f , rm reclamará sobre arquivos ausentes:

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

Com -f , ficará em silêncio:

$ rm -f nonesuch
$
    
por 29.04.2016 / 20:44
7

Você afirmou que ainda deseja ver outras saídas do comando rm ao executá-lo, mas usar a opção -f irá suprimi-las. Você precisará filtrar o STDERR para o que você quer, o que é um pouco complicado, já que você quer que todo o resto seja mostrado.

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>&- é mudar de 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 apenas suprimir totalmente as mensagens de erro, pode executar o seguinte comando:

rm filename 2> /dev/null

Este comando redireciona STDERR para / dev / null, assim você não o verá quando executar o comando.

    
por 29.04.2016 / 20:56
7

Se sua exigência for que rm não reclame de arquivos ausentes, mas que você também queira qualquer saída outra de rm , minha sugestão seria primeiro testar a existência do arquivo de destino , e apenas chame rm ( sem o -f flag) se o arquivo realmente existir.

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

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

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

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

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

    
por 30.04.2016 / 02:29
4

Como alternativa, você pode usar o comando find com a opção -delete . Isso (obviamente) excluirá apenas os arquivos que encontrar, de modo que nunca avise se não houver nenhum. Um exemplo pode ser:

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

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

É sempre uma boa idéia executar estes comandos sem a opção -delete primeiro, para ter certeza de encontrar os arquivos que você espera.

    
por 30.04.2016 / 20:17
3

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

-f, --force

ignore nonexistent files and arguments, never prompt

    
por 29.04.2016 / 20:44
2

Isso é um hack, mas você sempre pode touch o arquivo prestes a ser removido. Se ele não existir, ele será criado, então rm poderá removê-lo.

    
por 30.04.2016 / 11:05
0

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

Attempt to remove the files without prompting for confirmation, 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. also remember The -f option overrides any previous -i options.

rm -f xyz-directory

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

    
por 30.04.2016 / 21:09
-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 todos os comandos) em vez de apenas fazer "o comando" do "comando 2 & gt" ; / dev / null "onde" o comando "é o comando que você está fazendo.

    
por 02.05.2016 / 00:29

Tags