Exclua os arquivos no diretório sem errar se já estiver vazio

31

Como parte de um script de implantação, desejo 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_cacheestiver vazio (bastante comum ao enviar muitas alterações em rápida sucessão ao nosso servidor de teste), isso imprimirá 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 quero reduzir a taxa de ruído / sinal na saída deste script.

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

Mark Amery
fonte

Respostas:

48

Como você provavelmente deseja remover todos os arquivos sem avisar, por que não usar a -fopção rmpara ignorar arquivos inexistentes?

rm -f /tmp/our_cache/*

Na página do manual:

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

Além disso, se houver subdiretórios /tmp/our_cache/e você desejar que esses e seus conteúdos também sejam excluídos, não esqueça a -ropção.

depquid
fonte
3
solução mais óbvia e eu não pensei nisso! Eu me sinto como o primeiro cara neste quadrinhos xkcd.com/399 ;-)
Huygens
6
find /tmp/our_cache/ -mindepth 1 -delete

Editar 1

removido "- tipo f

Editar 2

Adicionada opção não padrão -mindepth 1para impedir que o diretório raiz da pesquisa seja removido (após remover a -type flimitação).

Hauke ​​Laging
fonte
Apenas uma nota, eu deixar de fora -type f, pois pode haver diretórios temporários, bem como (embora o exemplo na questão não conta para eles, então eles provavelmente não está lá ...)
Izkata
1
o uso -type fexcluirá apenas arquivos regulares; portanto, links simbólicos, por exemplo, não serão excluídos.
Huygens
Desculpe, eu não verifiquei isso, mas apenas dei uma olhada nas páginas de manual que diz "Excluir arquivos", sem mencionar os diretórios. Eu apago meu comentário.
Hauke ​​Laging 15/03/2013
1
Isso remove, /tmp/our_cacheassim você também pode fazer rm -r /tmp/our_cache. Enquanto estiver usando opções fora do padrão, você poderá usar -mindepth 1. Observe que rm /tmp/our_cache/*, ao contrário , também remove subdiretórios e seu conteúdo e arquivos ocultos.
Stéphane Chazelas
2

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

$  rm /tmp/our_cache/* 2>/dev/null
pradeepchhetri
fonte
2
Isso também não suprimirá os erros mostrados se, por exemplo, um arquivo não puder ser excluído porque está em uso? O único erro que quero suprimir é o mostrado se o diretório de destino estiver vazio; isso parece ter efeitos colaterais indesejados.
Mark Amery
Mesmo se você tentar excluir algum arquivo que algum processo abriu, você não receberá um erro.
Pradeepchhetri
1

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

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

isso usa testou [para testar se a sequência retornada da execução de um lsem seu diretório não está vazia. Então, se, e somente se, essa sequência NÃO estiver vazia, ela removerá tudo do seu diretório.

OBSERVAÇÃO: deixar a glob fora do sistema lssuprimirá o erro de nenhum arquivo.

h3rrmiller
fonte
-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 -fmodificador rmpara excluir esse tipo de arquivo), mas evitará o erro quando não houver arquivos.

Se você usar outro shell que não o BASH para seus scripts, como zsh, ksh, poderá tentar esta outra sintaxe que pode ser mais portátil:

if [[ "$(ls /tmp/our_cache/)" !=  "" ]]; then rm /tmp/our_cache/*; fi
Huygens
fonte