sincroniza com a máquina remota via http, e apaga arquivos antigos

0

Eu tenho uma pasta no meu sistema (Ubuntu) que é sincronizada com o trabalho usando wget . Os nomes dos arquivos estão nos seguintes formatos: A156.0.1.x, A156.0.y, A156.0.z, A156.0.a, A156.0.b. Todos os arquivos são criados em algum momento no meu escritório e todos têm a mesma hora e data. Rsync e qualquer outra conexão com o escritório não é permitida.

Estou sincronizando 4 vezes ao dia e não há um padrão de quantas vezes os arquivos serão criados. Pode não haver uma alteração nas pastas por algumas semanas ou pode ser 10 vezes em um dia. Uma vez que o novo arquivo é criado, ele será nomeado como A156.1 [a, b, x, y, z]. Cada arquivo é enorme (~ 500MB).

Então, estou terminando de ter mais de um conjunto de arquivos (5) no meu sistema e tenho no total 10 arquivos × 500MB = 5 GB.

Existe algum script fácil que pode ser executado pelo cron para verificar frequentemente a pasta e excluir os arquivos mais antigos? Então, vou acabar apenas com o último conjunto de 5. Eu poderia executar algo como excluir arquivos com mais de x dias, mas nunca temos certeza de quando o próximo conjunto de arquivos será criado.

    
por john 04.01.2018 / 15:28

3 respostas

0

Você pode usar find canalizado em sort para lista arquivos classificados por data e, em seguida, use cut na saída para gerar uma lista de arquivos e, em seguida, use rm excluir todos os arquivos, exceto os últimos 5 arquivos. Rodar isto periodicamente deve ter o resultado que você está procurando.

Eu não sei de um script existente, mas isso deve ser bastante trivial de implementar.

    
por 04.01.2018 / 15:39
0

Se você pode usar o zsh, ele tem qualificadores que facilitam muito isso :

zsh -c 'rm work-folder/*(om[6,-1])'

Isso indica que para selecionar todos os arquivos no diretório da pasta de trabalho, ordenou o pelo tempo de modificação m e selecionando ainda apenas o intervalo de 6 até o final. Isso deixa os 5 arquivos mais recentes na pasta.

Isso pressupõe que você tenha 6 ou mais arquivos no diretório para começar; você poderia envolver um teste em torno da remoção para ficar mais seguro (tudo em zsh):

files=(work/*(om))
[ ${#files[@]} -gt 5 ] && echo rm "${files[6,-1]}"

É mais trabalho no bash, já que você precisa chamar stat em cada arquivo e acompanhar você mesmo, ao longo esta linha .

    
por 09.01.2018 / 19:14
0

O script a seguir exibirá uma lista de "novos arquivos" e "arquivos antigos" em um diretório. Por "novos arquivos" entende-se arquivos que foram modificados após a última execução do script e por "arquivos antigos" que não foram modificados desde a última execução do script.

O script grava a saída de date em um "arquivo de timestamp" e usa esse arquivo na próxima execução para determinar quais arquivos foram alterados. na primeira execução, nenhuma saída será produzida.

O script deve ser executado manualmente e, como está escrito, só lhe dará a oportunidade de detectar quais arquivos foram modificados em um diretório específico.

#!/bin/sh

topdir=$HOME  # change this to point to the top dir where your files are

stamp="$topdir/timestamp"

if [ -f "$stamp" ]; then
    echo 'New files:'
    find "$topdir" -type f ! -name timestamp -newer "$stamp"

    echo 'Old files:'
    find "$topdir" -type f ! -name timestamp ! -newer "$stamp"
fi

date >"$stamp"

Isso pode ser modificado para

  • avisa o usuário para excluir os arquivos antigos,
  • detecta apenas arquivos que correspondem a um determinado padrão (usando -name 'pattern' , por exemplo, -name 'A156.1.[abxyz]' ),
  • observe o tempo de alteração do inode ("ctime") em vez do tempo de modificação (usando -cnewer em vez de -newer se o seu find oferecer suporte),
  • etc.
por 25.06.2018 / 09:03

Tags