拡張子を参照せずにファイルを一覧表示する 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、、などの出力を解析することはお勧めしませんfindParsingLs - Greg の 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あなたが望むことをするはずです。

関連情報