Mantenha todos os arquivos do mesmo mês + último arquivo antes disso, remova o resto

1

Eu quero um script de shell que mantenha todos os arquivos com data e hora do mesmo mês da hora atual + o arquivo mais recente antes disso, e exclua o restante dos arquivos no diretório.

Todos os nomes de arquivo armazenados no diretório são estruturados como name$timestamp.extension , onde

timestamp='date "+%Y%m%d-%H%M%S"'

Então, isso significa que, se houver o seguinte arquivo no diretório:

name161214-082211.gz
name161202-082211.gz
name161020-082211.gz
name161003-082211.gz
name161001-082211.gz

O arquivo restante no diretório após a execução deste código será:

name161214-082211.gz
name161202-082211.gz
name161020-082211.gz

PS. Extremamente novo para shell. Adoraria não só ter um código de trabalho, mas também aprender. Então, se você fosse gentil, por favor, explique o código também. Obrigada!

    
por Perth 14.12.2016 / 22:47

1 resposta

0

Com zsh , você pode fazer algo como

# get current date (YYMM) in a variable 
crd=$(date "+%y%m")
# use a function to extract the 13 chars that make up the timestamp
dtts() REPLY=${${REPLY%%.*}: -13}
# sort file names by the timestamp in descending order, exclude the ones with the
# same YYMM as the current date and set the remaining file names as arguments
set -- *(.O+dtts^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_)
# remove the first item from the list (i.e. the last one before current month)
shift
# print the remaining file names
print -rl -- "$@"

Isso usa a expansão de parâmetros e os qualificadores da glob :
ele primeiro seleciona os arquivos regulares (.) classifica em ordem decrescente ( O ) pelo timestamp usando a função dtts , então o e string ^e_'[[ "${${REPLY%%.*}: -13:4}" == "$crd" ]]'_ deseleciona os arquivos se o registro de data e hora corresponder ao ano e mês atuais a expressão dentro de citações retorna true); shift , em seguida, remove o primeiro item da lista (desde que os nomes foram classificados em ordem decrescente, que seria o último registro de data e hora anterior ao mês atual)
Substitua print -rl por rm se você estiver satisfeito com o resultado.

    
por 16.12.2016 / 00:22