Linux remove arquivos sem erros

1

Eu tenho isso funcionando como cron job

/usr/bin/find /backups/* -mtime +5 -exec rm -rf {} \;

Mas isso me dá esse erro no e-mail

/usr/bin/find: '/backups/Jun-20-2014': No such file or directory

Existe alguma maneira de ignorar esse erro sem redirecionar a saída de erro

    
por Mirage 27.06.2014 / 08:37

4 respostas

1

Use xargs da seguinte forma:

find /backups/ -mtime +5 -print0 | xargs -0 rm -rf

-0 está lá para manipular nomes de arquivos com espaços corretamente. Observe que isso funcionará muito mais rápido que find -exec , porque ele tentará colocar muitos arquivos em uma única invocação rm .

    
por 27.06.2014 / 13:25
1

Esta é uma solução feia , mas funcionou para mim em vários casos…

Você pode armazenar a saída do comando em um var, redirecionando a saída para stdout , assim:

result=$( <your find command here> 2>&1 )

Como find não produz resultados, qualquer erro é enviado para stderr e a saída armazenada em result é apenas o que é enviado para stdout , redirecionamos stderr para stdout para capturar o erro em $result , então você pode verificar se $result está vazio (sucesso) ou não (houve um erro). Assim, você pode criar seu código para enviar o e-mail de acordo:

if [ -z "$result" ]; then
    # If $result is empty, find was successful
else
    # The result is not empty because there was
    # an error, send a mail to notify.
fi

Isso, obviamente, ignora a premissa de não redirecionar a saída , mas como eu não sei por que você não quer redirecioná-la, isso pode ser uma solução.

    
por 27.06.2014 / 09:08
0

Parece que o arquivo está lá quando o shell expande * , mas não há mais quando find o processa.

Você pode tentar:

/usr/bin/find /backups/ -depth 1 -mtime +5 -exec rm -rf {} \;

Isso processará todos os arquivos em /backups/ e com -depth 1 , excluindo o próprio diretório inicial.

    
por 27.06.2014 / 10:41
0

Este não é um problema. find pré-processa partes da árvore, e quando tenta acessar arquivos já deletados, gera stderr.

Você pode simplesmente ignorar os erros, -prune do diretório ou percorrer DFS fassion, ou seja, um dos seguintes

/usr/bin/find /backups/ -mtime +5 -exec rm -rf {} + 2>/dev/null
/usr/bin/find /backups/ -mtime +5 -prune -exec rm -rf {} +
/usr/bin/find /backups/ -depth -mtime +5 -exec rm -rf {} +

+ pode ser usado para comandos que usam vários argumentos, então você não precisa executar mais rm do que o necessário

O problema real é com o uso de mtime . O que eu estou supondo que você quer fazer é excluir os arquivos que não foram modificados nos últimos cinco dias. Em seguida, você deve excluir explicitamente apenas os arquivos, ou seja, um dos seguintes

/usr/bin/find /backups/ -type f -mtime +5 -exec rm -f {} +
/usr/bin/find /backups/ -type f -mtime +5 -delete

E depois você pode incluir um segundo comando find para excluir diretórios vazios, ou seja, um dos seguintes

/usr/bin/find /backups/ -mindepth 1 -type d -empty -delete
/usr/bin/find /backups/ -mindepth 1 -type d -empty -exec rm -rf {} +

O problema com a exclusão de diretórios com base no mtime é que o mtime só mudará quando os arquivos forem movidos para / do diretório. Mas ainda pode ter arquivos que foram modificados nos últimos cinco dias, apesar de ter um tempo de modificação mais antigo.

    
por 24.07.2014 / 20:27