Como encontrar o arquivo mais recente e excluir arquivos antigos em um grupo de arquivos no script zsh? [duplicado]

0

Estou enfrentando problemas no script zsh. Eu tenho um grupo de arquivos em um diretório como:

001_20160223.txt  /delete
001_20161102.txt  /delete
001_20161209.txt  /keep
005_20160502.txt  /delete 
005_20161105.txt  /delete
005_20161206.txt  /keep
009_20160502.txt  /delete
009_20161105.txt  /delete
009_20161205.txt  /keep

Agora, temos que classificar os arquivos com o mesmo número inicial, por exemplo. 001 e depois encontramos o último arquivo baseado na data escrita no nome do arquivo e deletamos arquivos antigos. Da mesma forma que temos que executar para outros arquivos também. Então a saída final no diretório seria a seguinte:

001_20161209.txt  /keep
005_20161206.txt  /keep
009_20161205.txt  /keep

Isso é o que eu tentei até agora:

files=($(find . -name "???_*.txt")) | if ((#files > 1)); then rm -- ${files[1,-2]}; fi

mas está excluindo todos os arquivos, exceto o último. Eu quero criar um grupo separado de arquivos com o mesmo nome inicial e depois excluí-lo.

    
por Deep198 07.04.2016 / 13:00

1 resposta

1

Você pode reverter a ordem dos arquivos ( sort --reverse ) para que os arquivos mais recentes sempre sejam os primeiros em um bloco de arquivos com o mesmo prefixo. Então você pode acompanhar o bloco atual (com $current_prefix ) e manter o primeiro arquivo em cada bloco ( continue ) e rm todos os outros arquivos no bloco:

current_prefix=
find . -name '???_*.txt' | sort --reverse | while read line; do
  if [[ ${line[1,5]} != $current_prefix ]]; then
    # we are at the beginning of a new block
    current_prefix=${line[1,5]}
    continue # actually not needed b/c there is nothing outside the if block.
  else
    rm -- $line
  fi
done

Observação: para testar isso primeiro, você pode inserir todos os comandos rm com echo .

Para listar apenas os arquivos que você deseja manter, você pode usar sort e uniq :

find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3
    
por 07.04.2016 / 13:54

Tags