Exclui arquivos no diretório sem erros se já estiverem vazios

26

Como parte de um script de implantação, eu quero despejar algumas coisas em cache do meu diretório temporário. Eu uso um comando como:

rm /tmp/our_cache/*

No entanto, se /tmp/our_cache estiver vazio (bastante comum ao pressionar muitas alterações em rápida sucessão em nosso servidor de teste), isso imprime a seguinte mensagem de erro:

rm: cannot remove '/tmp/our_cache/*': No such file or directory

Não é grande coisa, mas é um pouco feio e eu quero reduzir a relação ruído-sinal na saída desse script.

O que é uma maneira concisa no unix para apagar o conteúdo de um diretório sem receber mensagens reclamando que o diretório já está vazio?

    
por Mark Amery 15.03.2013 / 17:44

5 respostas

40

Como você supostamente deseja remover todos os arquivos sem avisar, por que não usar apenas a opção -f para rm para ignorar arquivos não existentes?

rm -f /tmp/our_cache/*

Da página man:

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

Além disso, se houver subdiretórios em /tmp/our_cache/ e você desejar excluir esses e seus conteúdos, não esqueça da opção -r .

    
por 15.03.2013 / 18:35
6
find /tmp/our_cache/ -mindepth 1 -delete

Editar 1

removido "-type f

Editar 2

Adicionada a opção não padrão -mindepth 1 para evitar que o diretório raiz da pesquisa seja removido (depois de remover a limitação -type f ).

    
por 15.03.2013 / 18:53
2

Você pode redirecionar o erro padrão para /dev/null para que não imprima isso

$  rm /tmp/our_cache/* 2>/dev/null
    
por 15.03.2013 / 17:50
1

Outra maneira (embora um pouco exagerada ...):

[ ! -z "$(ls -A /tmp/our_cache/)" ] && rm -rf /tmp/our_cache/*

isso usa test ou [ para testar se a string retornada da execução de um ls em seu diretório não está vazia. Então, se, e somente se, essa cadeia NÃO estiver vazia, ela removerá tudo sob seu diretório.

OBSERVAÇÃO: deixar o glob fora do ls suprimirá o erro de nenhum arquivo.

    
por 15.03.2013 / 19:04
-1

Se o seu script estiver usando o BASH, você pode tentar:

if test "$(ls /tmp/our_cache/)" !=  ""; then rm /tmp/our_cache/*; fi

Isso ainda produzirá um erro se houver um problema "real" ou se um arquivo estiver protegido (você precisará do modificador -f de rm para excluir esse tipo de arquivo), mas evitará o erro quando não houver arquivos.

Se você usa outro shell além do BASH para o seu script, como o zsh, ksh, você pode tentar esta outra sintaxe que pode ser mais portável:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
    
por 15.03.2013 / 17:53

Tags