O script:
#!/bin/bash
# Get Prefixes
PREFIXES=$(ls | grep -Po '^(.*)(?!HT\d{4})-(.*)-(.*).tar.bz2$' | awk -F'-' '{print $1}' | uniq)
if [ -z "$1" ]; then
echo need a number of keep files.
exit 1
else
NUMKEEP=$1
fi
for PREFIX in ${PREFIXES}; do
ALL_FILES=$(ls -t ${PREFIX}*)
if [ $(echo ${ALL_FILES} | wc -w) -lt $NUMKEEP ]; then
echo Not enough files to be kept. Quit.
continue
fi
KEEP=$(ls -t ${PREFIX}* | head -n${NUMKEEP})
for file in $ALL_FILES ; do
if [[ "$KEEP" =~ "$file" ]]; then
echo keeping $file
else
echo RM $file
fi
done
done
Explicação:
- Calcule os prefixos:
- Procure todos os arquivos seguindo o
something-something-something.tar.bz2
regex, cortando apenas a primeira parte até o primeiro traço e tornando-a única. - o resultado é uma lista normalizada do
PREFIXES
- Procure todos os arquivos seguindo o
- Iterar todos os
PREFIXES
: - Calcular
ALL_FILES
comPREFIX
- Verifique se a quantia de
ALL_FILES
é menor que o número de arquivos a serem mantidos - > se for verdade, podemos parar por aqui, nada para remover - Calcule os arquivos
KEEP
que são os arquivosNUMKEEP
mais recentes - Altere por
ALL_FILES
e verifique se o arquivo fornecido não está na lista de arquivosKEEP
. Em caso afirmativo: remova-o.
Exemplo de resultado ao executá-lo:
$ ./remove-old.sh 2
keeping bar-01-01.tar.bz2
keeping bar-01-02.tar.bz2
RM bar-01-03.tar.bz2
RM bar-01-04.tar.bz2
RM bar-01-05.tar.bz2
RM bar-01-06.tar.bz2
keeping foo-01-06.tar.bz2
keeping foo-01-05.tar.bz2
RM foo-01-04.tar.bz2
RM foo-01-03.tar.bz2
RM foo-01-02.tar.bz2
$ ./remove-old.sh 8
Not enough files to be kept. Quit.
Not enough files to be kept. Quit.