Pegue os 100 arquivos mais antigos de milhares e feche-os, mas crie também uma lista desses arquivos que eu posso mandar mais tarde

0

Eu queria saber se existe uma maneira de pegar os 100 arquivos mais antigos de um diretório que tenha um 1000 ou mais nele com o mesmo prefixo (cdr12345.csz, cdr32342.csv, cdr 98876.csv, etc.) e listar os nomes desses 100 arquivos para o arquivo.txt, que eu posso catar e ler mais tarde e, em seguida, zipar esses 100 arquivos para cima. Eu só posso fazer 100 de cada vez, então como posso obter os 100 mais antigos primeiro? Ressalva é que o arquivo zip deve estar abaixo de 500 mgb.

    
por Scott Mick 05.10.2018 / 17:22

3 respostas

1

Em termos de identificar os 100 arquivos mais antigos, você pode fazer algo como:

ls -1tr /path/to/directory/cdr* | head -n100 > filelist.txt

O -1 listará um arquivo por linha (não estritamente necessário aqui), o -t classificará por hora de modificação, o mais novo primeiro e o -r reverterá a ordem de classificação (ou seja, fará a lista último mais recente). O pipe com saída para head -n100 listará as primeiras 100 linhas (isto é, os 100 arquivos mais antigos). Em seguida, redireciono a saída disso para filelist.txt - esse arquivo contém os nomes dos 100 arquivos mais antigos.

Você pode então compactar esses arquivos com:

zip backup -@ < filelist.txt

Isso criará um arquivo chamado backup.zip com o conteúdo dos arquivos no filelist.txt . A opção -@ instrui zip a ler os nomes dos arquivos a partir da entrada padrão, e o redirecionamento fornece essa lista a partir do arquivo.

Uma vez que você tenha testado muito e veja se ele faz o que você quer, você pode remover os arquivos em filelist.txt :

xargs rm < filelist.txt

Isso vai deixar você com:

  1. filelist.txt da lista dos arquivos mais antigos
  2. backup.zip do conteúdo dos arquivos mais antigos

Observe que isso não afeta seu limite de tamanho de arquivo de 500 MB. Uma abordagem seria examinar o tamanho do arquivo zip depois de criá-lo e, se for muito grande, diminuir o número de arquivos incluídos no arquivo.

    
por 05.10.2018 / 17:42
0

O comando

ls -1tr | head -n 100

fornecerá uma lista dos 100 arquivos mais antigos em um diretório.

Você pode salvar essa saída em um arquivo (por exemplo, zip.in). Você pode então usar esse arquivo para criar um arquivo zip. Por exemplo:

zip zipfile.zip $(cat zip.in)

Em termos do arquivo zip ter que ter menos de 500 MB, você pode calcular o tamanho total dos arquivos individuais para ver se eles excedem 500 MB. No entanto, como o zip está fazendo alguma compressão, isso não é exato. Você só saberá quando o arquivo zip for criado.

Você poderia adicionar cada arquivo na lista zip.in de uma vez para zipfile.zip. Depois de adicionar cada um, você pode verificar o tamanho do zipfile.zip para ver se ele excede 500MB.

Espero que isso ajude.

    
por 05.10.2018 / 17:42
0

Enquanto salvar e re-analisar nomes de arquivos pode ser complicado, se seus nomes não contiverem espaços ou novas linhas, você pode lidar com eles com menos cuidado. Vou mostrar um método usando zsh, onde os nomes dos arquivos nunca são analisados diretamente.

Reúna os nomes dos arquivos em uma matriz:

files=( cdr*.csv(om[-100,-1]) )

Isso diz para corresponder nomes de arquivos que começam com cdr e terminam com .csv , mas para o rder esses arquivos pelos tempos de modificação e, em seguida, selecione apenas os 100 mais antigos.

Você pode imprimi-los em um arquivo de várias maneiras, como:

print -l $files > filelist.txt
printf 'File: %s\n' $files

Para criar um arquivo zip desses arquivos, então:

zip zipfile $files

... onde, em cada instância, o zsh substitui a variável $files por cada elemento. Uma maneira mais cuidadosa de fazer a mesma expansão seria usar ${files[@]} .

    
por 05.10.2018 / 18:12