find . -print | awk -F . '{print $NF}' | sort | uniq -c | sort -n
( awk -F . '{print $NF}' leaves only file extension. )
For example, libssh-0.9.4 project:
... 1 yml 2 md 2 png 2 sh 6 in 8 svg 9 pub 12 dox 14 symbols 14 txt 27 cmake 65 h 174 c
Would work for a current directory only. Like, libssh-0.9.4/tests:
% file -b * | sort | uniq -c | sort -n 1 Python script, ASCII text executable 4 ASCII text 9 directory 19 C source, ASCII text
I'm using the -b option of the file here:
-b, --brief Do not prepend filenames to output lines (brief mode).
Now for all files in tree:
% find . -type f -exec file -b {} \; | sort | uniq -c | sort -n 1 ASCII text, with no line terminators 1 C++ source, ASCII text 1 C source, ASCII text, with very long lines 1 data 1 empty 1 HTML document, ASCII text 1 HTML document, UTF-8 Unicode text 1 JSON data 1 OpenSSH DSA public key 1 OpenSSH ED25519 public key 1 OpenSSH private key 1 OpenSSH RSA1 private key, version 1.1 1 PEM DSA private key 1 Python script, ASCII text executable 1 ReStructuredText file, UTF-8 Unicode text 1 UTF-8 Unicode text 2 ASCII text, with very long lines 2 OpenSSH ECDSA public key 2 PEM EC private key 2 PNG image data, 25 x 25, 8-bit/color RGBA, non-interlaced 3 OpenSSH RSA public key 3 ReStructuredText file, ASCII text 4 PEM RSA private key 8 SVG Scalable Vector Graphics image 80 ASCII text 245 C source, ASCII text
For libssh-0.9.4 again:
% find . -type f -exec stat {} \; File: ./src/dh_key.c Size: 10023 Blocks: 24 IO Block: 4096 regular file Device: fd00h/64768d Inode: 31855060 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ i) Gid: ( 1000/ i) Access: 2021-12-07 12:31:34.074679564 +0200 Modify: 2020-04-06 12:36:35.000000000 +0300 Change: 2020-12-18 20:19:06.156283089 +0200 Birth: - File: ./src/knownhosts.c Size: 36939 Blocks: 80 IO Block: 4096 regular file Device: fd00h/64768d Inode: 31855074 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ i) Gid: ( 1000/ i) Access: 2021-12-07 12:31:34.090679832 +0200 Modify: 2020-01-27 17:45:32.000000000 +0200 Change: 2020-12-18 20:19:06.188283745 +0200 Birth: -
Let's narrow this info to 'Modify' field only:
% find . -type f -exec stat {} \; | grep Modify Modify: 2020-01-27 17:45:32.000000000 +0200 Modify: 2020-03-27 14:13:36.000000000 +0200 Modify: 2020-01-27 17:45:32.000000000 +0200 Modify: 2020-01-27 17:45:32.000000000 +0200 Modify: 2020-01-27 17:45:32.000000000 +0200
Pull only date from these strings:
% find . -type f -exec stat {} \; | grep Modify | cut -d ' ' -f 2 2020-01-27 2020-01-27 2020-01-27 2020-01-27 2020-04-09 2020-04-09
Collect statistics. What days are most active:
% find . -type f -exec stat {} \; | grep Modify | cut -d ' ' -f 2 | sort | uniq -c | sort -n 1 2018-12-07 2 2019-01-31 2 2020-03-30 3 2009-06-15 3 2013-02-07 7 2020-03-27 8 2016-02-15 8 2018-09-10 9 2020-04-06 22 2018-10-19 68 2020-04-09 234 2020-01-27
Narrow to pure C files using -name or -iname:
% find . -name '*.c' -type f -exec stat {} \; | grep Modify | cut -d ' ' -f 2 | sort | uniq -c | sort -n 1 2009-06-15 1 2013-02-07 1 2018-09-10 1 2018-12-07 4 2018-10-19 5 2016-02-15 6 2020-03-27 8 2020-04-06 34 2020-04-09 113 2020-01-27
Yes, I know about these lousy Disqus ads. Please use adblocker. I would consider to subscribe to 'pro' version of Disqus if the signal/noise ratio in comments would be good enough.