Exclui todos os arquivos mais antigos que um nome de arquivo específico?

2

Eu quero poder procurar o arquivo mais recente que termina em .backup e excluir TODOS os arquivos que são mais antigos do que esse arquivo (mas, é claro, manter os arquivos mais recentes).

Aqui está um exemplo de uma listagem de diretórios onde você pode ver vários backups feitos. Eu gostaria de manter os arquivos 000000020000000000000083.00000020.backup e 000000010000000000000082 mas de alguma forma excluir tudo o que é mais antigo.

Eu posso pensar em muitas maneiras de fazer isso, como fazer um find com -mtime e excluir mais de um dia, o que pode funcionar para mim, mas não é correto . Eu também poderia fazer uma listagem do diretório antes de fazer o meu backup, em seguida, compará-lo para depois e excluir todos os arquivos que foram anteriores. Isso ainda não está correto.

Alguma idéia?

$ ls -ltr
total 131084
-rw-r-----. 1 cm800 cm800        0 May  6 13:58 archive_06_05_14___13_58_05
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 00000001000000000000007F
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000081
-rw-------. 1 cm800 cm800      242 May  6 13:58 00000001000000000000007F.00000020.backup
-rw-------. 1 cm800 cm800      242 May  6 13:58 000000020000000000000081.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:03 000000010000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000020000000000000082
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000010000000000000081
-rw-------. 1 cm800 cm800 16777216 May  6 14:07 000000020000000000000083
-rw-------. 1 cm800 cm800      242 May  6 14:07 000000020000000000000083.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:11 000000010000000000000082
    
por AaronG 07.05.2014 / 00:38

1 resposta

3

Use os operadores -nt , -ot para testar se um arquivo é mais novo / antigo que o outro:

#! /bin/bash

# Find the newest backup file:
unset newest
for f in *.backup ; do
    [[ $newest ]] || newest=$f           # Initialize.
    [[ $f -nt $newest ]] && newest=$f    # Keep the newest so far.
done

# Delete all the older files:
for f in * ; do
    [[ $f -ot $newest ]] && rm "$f"
done
    
por 07.05.2014 / 00:50