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.bz2regex, 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_FILEScomPREFIX - 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
KEEPque são os arquivosNUMKEEPmais recentes - Altere por
ALL_FILESe 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.