Com zsh
:
typeset -A seen=()
for f (*.log*(nOn)) {((seen[${f%%.*}]++)) && echo rm -f -- $f}
(remova echo
se estiver satisfeito com o resultado.
*.log*(nOn)
lista os arquivos *.log*
numericamente ao contrário (onde f.log
classifica após f.log.0
após f.log.9
depois de f.log.10
).
typeset -A seen=()
declara uma matriz associativa $seen
. Nós rm
do arquivo se a parte antes do primeiro .
( ${f%%.*}
) foi vista antes.
Com qualquer shell e utilitários GNU
printf '%sprintf '%s\n' *.log* |
sort -rt. -k1,1 -k3,3rn |
awk -F. 'seen[$1]++' |
xargs echo rm -f --
' *.log* |
sort -rzV |
gawk -v RS='typeset -A seen=()
for f (*.log*(nOn)) {((seen[${f%%.*}]++)) && echo rm -f -- $f}
' -v ORS='printf '%sprintf '%s\n' *.log* |
sort -rt. -k1,1 -k3,3rn |
awk -F. 'seen[$1]++' |
xargs echo rm -f --
' *.log* |
sort -rzV |
gawk -v RS='%pre%' -v ORS='%pre%' -F. 'seen[$1]++' |
xargs -r0 echo rm -f --
' -F. 'seen[$1]++' |
xargs -r0 echo rm -f --
POSIXly ou com utilitários do busybox
Mas, supondo que os nomes dos arquivos não contenham caracteres de espaçamento ou citações ou barras invertidas:
%pre% Todos eles assumem a parte do nome do arquivo antes de .log
não conter pontos.