¿Existe la opción de enumerar archivos sin referencia a la extensión?

¿Existe la opción de enumerar archivos sin referencia a la extensión?

Usamos un control de versión numérico para archivos (por ejemplo: report01.log.01, report01.log.02, report01.log.03, etc.)

Lo que necesito hacer es producir una lista de cada archivo y la cantidad de versiones que tiene.

¿Linux tiene una función para hacer esto con relativa facilidad?

Respuesta1

Otro enfoque : ls | cut -f1 -d. | uniq -c.

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

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

Respuesta2

Yo desaconsejaría analizar la salida de ls, find, etc (verAnálisis de Ls - Greg's Wikipara obtener una explicación de por qué es una mala idea).

En cambio,Expansión de parámetrosen una matriz bash puede producir una lista sin las extensiones de archivo.

filelist=(*);                      # or filelist=(*.log.*) to be more precise
printf '%q\n' "${filelist[@]%.*}"  # or echo "${filelist[@]%.*}"

Luego, trabajar en los archivos individualmente..

for i in "${filelist[@]%.*}"; do
   echo "$i";
done

Para el propósito particular de OP, podemos usar un bashmatriz asociativapara mantener el recuento de versiones.

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

Respuesta3

Algo así ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -cdebería hacer lo que quieras.

información relacionada