Utilizamos um controle de versão numérico para arquivos (ex: report01.log.01, report01.log.02, report01.log.03, etc.)
O que preciso fazer é produzir uma lista de cada arquivo e o número de versões que o arquivo possui.
O Linux tem uma função para fazer isso com relativa facilidade?
Responder1
Outra abordagem: ls | cut -f1 -d. | uniq -c
.
awk
abordagem :ls | awk -F. '{a[$1]++}END{for(b in a){print b,a[b]}}'
abordagem (prolongada) perl
:ls|perl -e 'while(<>){$a{(split(/\./,$_))[0]}++}for(sort keys %a){print "$_ $a{$_}\n"}'
Responder2
Eu desaconselho analisar a saída de ls
, find
, etc (vejaAnáliseLs - Wiki de Gregpara obter uma explicação de por que isso é uma má ideia).
Em vez de,Expansão de parâmetrosem um array bash pode produzir uma lista sem as extensões de arquivo.
filelist=(*); # or filelist=(*.log.*) to be more precise
printf '%q\n' "${filelist[@]%.*}" # or echo "${filelist[@]%.*}"
Então, para trabalhar nos arquivos individualmente.
for i in "${filelist[@]%.*}"; do
echo "$i";
done
Para o propósito específico do OP, podemos usar um bashmatriz associativapara manter a contagem de versões.
filelist=(*.log.*)
declare -A count
for i in "${filelist[@]%.*}"; do
(( count["$i"]++ ));
done
for j in "${!count[@]}"; do
printf '%q\t%q\n' "$j" "${count[$j]}";
done | sort
report01.log 6
report02.log 6
report03.log 6
report04.log 6
report05.log 6
Responder3
Algo como ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -c
deveria fazer o que você quiser.