ls opção para listar arquivos sem referência a extensão? [fechadas]

3

Usamos um controle de versão numérica para arquivos (ex: report01.log.01, report01.log.02, report01.log.03, etc.)

O que eu 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?

    
por Richard 17.04.2017 / 15:31

3 respostas

5

Outra abordagem: ls | cut -f1 -d. | uniq -c .

awk approach: ls | awk -F. '{a[$1]++}END{for(b in a){print b,a[b]}}'

(sem fôlego) perl abordagem: ls|perl -e 'while(<>){$a{(split(/\./,$_))[0]}++}for(sort keys %a){print "$_ $a{$_}\n"}'

    
por 17.04.2017 / 15:37
5

Eu não aconselharia analisar a saída de ls , find , etc (veja ParsingLs - Greg's Wiki para uma explicação de porque é uma má ideia).

Em vez disso, a Expansão de Parâmetros em uma matriz 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 a finalidade específica do OP, podemos usar uma matriz associativa para 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
    
por 17.04.2017 / 20:57
2

Algo como ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -c deve fazer o que você quer.

    
por 17.04.2017 / 15:34