Bash: apaga todos os arquivos, exceto os mais recentes n com prefixo x

1

Eu tenho um diretório de backups que se parece com isso:

-rw-r--r--   1 ftpuser ftponly   5610595 May 27 00:01 alpha-114.tar.asc   
-rw-r--r--   1 ftpuser ftponly  50559368 May 27 00:04 beta-211.tar.asc
-rw-r--r--   1 ftpuser ftponly  61320807 May 27 00:06 gamma-387.tar.asc
-rw-r--r--   1 ftpuser ftponly  43125044 May 27 00:07 epsilon-241.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107110560 Apr 26 04:33 zeta-7728.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107136555 Apr 27 00:29 zeta-7729.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107154163 Apr 28 00:29 zeta-7731.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107194763 May  1 00:33 zeta-7734.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107200582 May  2 00:33 zeta-7736.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107203436 May  4 00:32 zeta-7737.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107250397 May  7 00:33 zeta-7739.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107269251 May  8 00:26 zeta-7741.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107917088 May  9 00:32 zeta-7747.tar.asc
-rw-r--r--   1 ftpuser ftponly  1107914021 May 10 00:22 zeta-7748.tar.asc
-rw-r--r--   1 ftpuser ftponly  1113095971 May 11 00:32 zeta-7751.tar.asc
-rw-r--r--   1 ftpuser ftponly  1114420811 May 12 00:32 zeta-7756.tar.asc
-rw-r--r--   1 ftpuser ftponly  1114433146 May 13 00:31 zeta-7757.tar.asc
-rw-r--r--   1 ftpuser ftponly  1114437345 May 14 00:32 zeta-7758.tar.asc
-rw-r--r--   1 ftpuser ftponly  1114437862 May 16 00:29 zeta-7762.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115062371 May 17 00:29 zeta-7778.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115068367 May 18 00:30 zeta-7781.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115067272 May 19 00:24 zeta-7782.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115077719 May 20 00:26 zeta-7784.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115080120 May 22 00:25 zeta-7785.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115076554 May 23 00:33 zeta-7786.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115877146 May 24 00:26 zeta-7789.tar.asc
-rw-r--r--   1 ftpuser ftponly  1115967469 May 27 00:53 zeta-7795.tar.asc

Eu quero excluir todos os 3, exceto os mais recentes, de todos os prefixos de arquivos, portanto, neste caso, todos os arquivos zeta-****. tar.asc, exceto os três últimos. Eu tenho um tipo de script perl complicado que faz isso, mas eu gostaria de poder fazer isso com o bash.

Trechos Slick apreciados!

    
por Frank Brenner 27.05.2011 / 12:13

4 respostas

1

Isso deve funcionar para uma quantidade arbitrária de prefixos, desde que eles sigam a convenção de prefixo-nome:

for i in 'ls | sed 's/-.*//' | uniq'; do ls -t $i-* | awk '{if(NR>3) print}' | xargs rm -f; done

    
por 27.05.2011 / 13:02
2

Você pode usar tail -n +3 para fornecer a você todas as três linhas iniciais de saída de ls -1t , por exemplo,

ls -1t zeta* | tail -n +3 | xargs rm 

Isto lista todos os arquivos do mais recente para o mais antigo em uma única coluna, a qual então processa e gera uma lista de arquivos após os 3 (mais recentes) arquivos iniciais.

    
por 30.05.2011 / 13:50
1
ls -lt prefix*suffix | gawk ' { if ($NR > 3) print $NF } ' | xargs rm

Funciona para mim. Não é infalível. Sem garantia. Sua milhagem pode variar.

    
por 27.05.2011 / 12:37
0

Isso excluirá todos os arquivos com mais de 3 dias. Você pode mudar isso. Isso basicamente procura por arquivos cujo tempo de modificação é menor que o now () - 3days e os apaga.

find $PATH  -mtime -3 -type f -exec rm {}

Opcionalmente, você pode definir um sinalizador "-iname" para procurar um padrão específico nos nomes de arquivos

-iname suffix*prefix

Para mais opções, consulte "localizar manpages"

    
por 27.05.2011 / 14:40

Tags