我们对文件使用数字版本控制(例如: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
等的输出(请参阅解析 - Greg's Wiki解释为什么这是一个坏主意)。
反而,参数扩展在 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
应该做你想做的事。