опция ls для вывода списка файлов без ссылки на расширение?

опция ls для вывода списка файлов без ссылки на расширение?

Мы используем числовой контроль версий для файлов (например: report01.log.01, report01.log.02, report01.log.03 и т. д.)

Мне нужно составить список каждого файла и количество его версий.

Есть ли в Linux функция, позволяющая сделать это относительно легко?

решение1

Другой подход: ls | cut -f1 -d. | uniq -c.

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

(длинный) perlподход:ls|perl -e 'while(<>){$a{(split(/\./,$_))[0]}++}for(sort keys %a){print "$_ $a{$_}\n"}'

решение2

Я бы не советовал анализировать вывод ls, find, и т.д. (см.ParsingLs - Вики Грегадля объяснения того, почему это плохая идея).

Вместо,Расширение параметровв массиве bash можно создать список без расширений файлов.

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

Затем, чтобы поработать с файлами индивидуально...

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

Для конкретных целей OP мы можем использовать bashассоциативный массивдля ведения подсчета версий.

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

решение3

Что-то вроде ls | sed -e 's/\.[0-9]\+$//' | sort | uniq -c«должно делать то, что ты хочешь».

Связанный контент