ls 选项可以在不参考扩展名的情况下列出文件?

Ric*_*ard 3 file-management

我们对文件使用数字版本控制(例如:report01.log.01、report01.log.02、report01.log.03 等)

我需要做的是生成每个文件的列表以及文件的版本数。

Linux 是否具有相对容易地执行此操作的功能?

ste*_*eve 5

另一种方法: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"}'


sha*_*omb 5

我建议对解析输出lsfind等等(见ParsingLs -格雷格的Wiki,对于为什么这是一个坏主意的解释)。

相反,bash 数组上的参数扩展可以生成一个没有文件扩展名的列表。

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

然后,单独处理文件..

for i in "${filelist[@]%.*}"; do
   echo "$i";
done
Run Code Online (Sandbox Code Playgroud)

对于 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
Run Code Online (Sandbox Code Playgroud)