Diclaimer: Eu testei os seguintes comandos com nomes de arquivos que contêm espaços, mas não com nomes de arquivos que contêm novas linhas. Eu suspeito que eles não vão jogar muito bem com nomes de arquivos contendo o caractere de nova linha, e evitaria usá-los se você suspeitar que nomes de arquivos que os contenham possam ser criados.
Essa abordagem depende do ctime do arquivo, portanto, se os arquivos tiverem seus atributos alterados, eles parecerão mais recentes do que o tempo de criação. Só você pode decidir se confiar em ctime é aplicável em sua situação. Se você preferir usar o mtime, altere -printf "%C+ %p\n"
para -printf "%T+ %p\n"
nos comandos find
.
O seguinte comando pode ser emitido dentro do diretório que contém seus arquivos tar. Isso pressupõe que os nomes dos arquivos sejam todos algo como something.tar
. Se os nomes dos arquivos não forem desse formato, o comando precisará ser modificado, alterando o -iname '*.tar.'
para -iname '*.tar.gz*'
se os arquivos forem arquivos .tar.gz ou removendo toda a string -iname '*.tar.'
se você quiser para operar em qualquer arquivo desse diretório, independentemente do formato do nome do arquivo.
find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} echo "{}"
Se isso mostrar os arquivos mais antigos, fora do limite de 15 arquivos, use o seguinte comando para excluir esses arquivos.
find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -15 | xargs -I{} rm "{}"
Por meio de explicação:
-
find . -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n"
listará todos os arquivos que terminam em .tar em.
(o diretório atual) sem recursão em subdiretórios. Em seguida, ele imprime o timastamp ctime seguido por um espaço e o nome do arquivo com um caractere de nova linha à direita. -
| sort -n
classifica a saída defind
numericamente, portanto, os arquivos são listados do mais antigo para o mais recente (por ctime). -
| cut -d ' ' -f 2-
remove o registro de data e hora adicionado quefind
criou, mas preserva a ordem dos arquivos listados porsort
. -
| head -n -15
apara os 15 itens inferiores da saída decut
. -
xargs -I{} rm "{}"
executa o comandorm
em cada arquivo, garantindo que o nome do arquivo não seja dividido em espaço em branco.
Isso pode ser escrito como um script bash, com o número de arquivos a serem retidos e o diretório no qual operar como variáveis no script. É possível passar o diretório e a contagem de retenção de arquivos como argumentos, mas não vou cobrir isso aqui.
#!/bin/bash
file_limit=15
dir=/directory/containing/tarfiles
find "$dir" -mindepth 1 -maxdepth 1 -type f -iname '*.tar' -printf "%C+ %p\n" | sort -n | cut -d ' ' -f 2- | head -n -"$file_limit" | xargs -I{} rm "{}"
Se você salvar este script em algum lugar, por exemplo /home/user/trim_old_gits
e garanta que você concedeu permissões executáveis. O script pode ser executado a partir da linha de comando, digitando:
/home/user/trim_old_gits
Ou de dentro de /home/user
:
./trim_old_gits
Como mencionado em Jacob é maravilhoso python answer , usando o utilitário cron
seria uma boa maneira de garantir que isso ocorra regularmente, se não for crucial que os arquivos sejam excluídos imediatamente, ou inotifywait
se o timing é mais sensível.