ファイル名を一意に並べ替える

ファイル名を一意に並べ替える

解決策を検索しましたが、私の問題に対する答えが見つかりませんでした。

私のディレクトリには何千ものファイルがあります。ファイル名は次の形式です。

74687_1543944930857.txt
74687_1543945090451.txt
74687_1543945278047.txt
74687_1543945465203.txt
75282_1543964541818.txt
75282_1543964595523.txt
75308_1543941117138.txt
75308_1543941398049.txt
75308_1543941677699.txt
75308_1543942393359.txt

これらのファイル名では、前の数字_(下線)はユーザーIDを決定します。のようにはユーザーIDです75308_1543942393359.txt75308したがって、上記の例には3人のユーザーがいます。74687, 75282 and 75308

ディレクトリの総ユーザー数をどのように知ることができますか?

答え1

出力をgrep次に渡しますsort

ls -1 | grep -oP "^\d+" | sort | uniq -c

これで、ユーザーIDとその数に基づいてデータをソートしました。

答え2

printf各ディレクトリ内のファイルを一覧表示し、awkユーザーIDを一意に識別するために使用されます。

shopt -s nullglob
printf '%s\n' *.txt | awk -F_ '!unique[$1]++ { print $1 }'

カウントを個別に印刷するには、次のようにします。

printf '%s\n' *.txt | awk -F_ '!unique[$1]++ { count++ } END { print count }'

答え3

そしてzsh

$ typeset -A count
$ for f (<->_*.txt(N)) ((count[${f%%_*}]++))
$ echo $#count users
3 users
$ printf '%s: %s\n' ${(kv)count}
74687: 4
75308: 4
75282: 2

関連情報