Мы используем числовой контроль версий для файлов (например: 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
«должно делать то, что ты хочешь».