labunix's blog

labunixのラボUnix

分散されたmp4ファイルの先頭の文字で集計をしてみる。

■分散されたmp4ファイルの先頭の文字で集計をしてみる。
 findで渡すファイル名のワイルドカードを、
 どこまで絞ったら良さそうかの目安がわかるだけで、
 特に実用性は無い。

$ lsb_release -d
Description:	Debian GNU/Linux 10 (buster)

■カレントやマウントしたディスクにざっくり8千ほどある。
 今回は各ディスク毎ではなく、あくまで全体を集計する。

$ find /media/ ./ -type f -name "*.mp4" | wc -l
8297

■デフォルトではmawk 1.3.3-17+b3。gawkもあるが今回はmawkだけで処理する。

$ ls -l /usr/bin/awk
lrwxrwxrwx 1 root root 21  62 11:56 /usr/bin/awk -> /etc/alternatives/awk

$ ls -l /etc/alternatives/awk
lrwxrwxrwx 1 root root 13  62 11:56 /etc/alternatives/awk -> /usr/bin/mawk

$ dpkg -l | awk '$1 ~ /ii/&&$2 ~/awk/{print $2,$3}'
mawk 1.3.3-17+b3

$ apt-file search bin/gawk
gawk: /usr/bin/gawk     

■[A-Za-z0-9]以外のファイル名が1508コあるが、今回は対象外とする。

$ SEARCH="/media/ ./"; \
  find /media/ ./ -type f -name "*.mp4" | env -i awk -F\/ '$NF !~ /^[A-Za-z0-9]/{a++}END{print a}'
1508

■mawkでは日本語がうまく扱えないので、[A-Za-z0-9]でフィルタする。
 また、小文字も大文字に変換して統一の上、集計する。

$ SEARCH="/media/ ./"; \
  find ${SEARCH} -type f -name "*.mp4" | \
    env -i awk -F\/ '{a[substr(toupper($NF),1,1)]+=1}END{for(n in a){if(n ~ /[A-Za-z0-9]/){print n,a[n] | "sort -uV"}}}'; \
  unset SEARCH
0 8
1 205
2 4
3 33
4 5
5 6
6 1
7 5
8 2
9 3
A 320
B 157
C 397
D 210
E 90
F 633
G 195
H 751
I 308
J 96
K 254
L 75
M 788
N 180
O 159
P 185
Q 1
R 198
S 882
T 277
U 34
V 59
W 74
X 88
Y 43
Z 63

■ファイル数が100未満のリストを抽出。

$ SEARCH="/media/ ./"; \
  find ${SEARCH} -type f -name "*.mp4" | \
    env -i awk -F\/ '{a[substr(toupper($NF),1,1)]+=1}END{for(n in a){if(n ~ /[A-Za-z0-9]/) \
                     {if(a[n]<99){print n,a[n] | "sort -uV"}}}}'; \
  unset SEARCH
1 1
A 48
B 26
C 6
D 35
E 5
F 24
G 16
H 53
I 54
J 18
K 27
L 11
M 31
N 25
O 14
P 15
R 13
S 91
T 19
U 4
V 6
W 20
X 11
Y 2
Z 3

■ファイル数が100以上のリストを抽出。

$ SEARCH="/media/ ./"; \
  find ${SEARCH} -type f -name "*.mp4" | \
    env -i awk -F\/ '{a[substr(toupper($NF),1,1)]+=1}END{for(n in a){if(n ~ /[A-Za-z0-9]/) \
                     {if(a[n]>99){print n,a[n] | "sort -uV"}}}}'; \
  unset SEARCH
1 205
A 320
B 157
C 396
D 210
F 633
G 195
H 751
I 308
K 254
M 788
N 180
O 159
P 185
R 198
S 883
T 277

■以下条件で先頭3文字で集計してみる。

$ SEARCH="/media/ ./"; \
  find ${SEARCH} -type f -name "*.mp4" | \
    env -i awk -F\/ '{a[substr(toupper($NF),1,1)]+=1}END{for(n in a){if(n ~ /[A-Za-z0-9]/) \
                     {if(a[n]>99){print n | "sort -uV"}}}}' | tr -d '\n';echo; \
  unset SEARCH
1ABCDFGHIKMNOPRST

$ SEARCH="/media/ ./"; \
  find ${SEARCH} -type f -name "*.mp4" | \
    env -i awk -F\/ '{a[substr(toupper($NF),1,3)]+=1}END{for(n in a){if(n ~ /[1ABCDFGHIKMNOPRST][A-Za-z0-9][A-Za-z0-9]/) \
                     {if(a[n]>99){print n,a[n] | "sort -uV"}}}}'; \
  unset SEARCH
1PP 107
CAN 194
FOR 575
HAK 225
HOU 156
RAC 100
TOK 134