Obtenha o número de arquivos que correspondem a um padrão em um diretório e exclua o mais antigo

4

Gostaria de fazer o seguinte:

  1. Obtenha o número de arquivos em um determinado diretório que corresponda a um determinado padrão, por exemplo:

    ExtractBackup_{date}.tar.gz

  2. Se esse número for 2 ou superior, exclua o arquivo mais antigo que corresponda a esse padrão.

Como faço para fazer isso usando um script Korn Shell ( .ksh )?

    
por Ben 29.06.2011 / 00:03

3 respostas

2

Não há nenhuma maneira direta de contar arquivos que correspondam a um padrão, mas você pode fazer isso em duas etapas fáceis: gerar a lista de arquivos e usar o tamanho da lista. Supondo que a data esteja no formato AAAAMMDD (observe que isso atrapalha os parâmetros posicionais):

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ -e "$1" ]; then count=$#; else count=0; fi

No ksh93, você pode facilitar a contagem fazendo com que a lista fique vazia se nenhum arquivo corresponder. Portavelmente, um padrão que não corresponde a nenhum arquivo é substituído por uma lista contendo uma palavra que é o próprio padrão; O ksh93 tem uma construção para ter o padrão expandido para uma lista vazia. Ksh tem arrays, o que significa que você não precisa estrobiar os parâmetros posicionais.

backups=(~(N:ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz))
count=${#backups[@]}

Se a data estiver no formato AAAAMMDD, o arquivo mais antigo será o primeiro da lista.

set ExtractBackup_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].tar.gz
if [ $# -ge 2 ]; then rm "$1"; fi
    
por 29.06.2011 / 00:34
2

Ok, execute este script com o padrão como argumento e se mais de um arquivo corresponder, ele excluirá o mais antigo, por exemplo:

$ ksh dtof.sh ?? # this will delete the oldest two-character file

O script:

for i in "$@"; do
  if [ ! "$oldest" ]; then
    oldest="$i"
    continue
  fi
  if [ "$i" -ot "$oldest" ]; then
    oldest="$i"
    reap="$i"
  else
    reap="$oldest"
  fi
done
[ "$reap" ] && rm "$reap"
    
por 29.06.2011 / 00:35
-1

Não sei sobre o ksh, então eu vou te dar algumas ferramentas que você pode juntar.

Encontre todos os arquivos na pasta atual que correspondam a um determinado padrão e retorne a contagem

find . -maxdepth 1 -type f -name '*.tgz' | wc -l

Para selecionar o arquivo mais antigo, selecione a primeira entrada da saída abaixo

ls -t1p | grep -v /

Boa sorte: -)

    
por 29.06.2011 / 00:28

Tags