locate
コマンドよりもはるかに高速なコマンドの使用を検討してくださいfind
。
テストデータで実行する
$ sudo updatedb # necessary if files in focus were added `cron` daily.
$ printf "Number Files: " && locate -0r "$PWD.*\.c$" | xargs -0 -I{} sh -c 'test ! -L "$1" && echo "regular file"' _ {} | wc -l && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -cu | wc -l
Number Files: 29
Number Dirs.: 7
ファイルからのシンボリックリンクの除去を支援してくれたMuruの回答に感謝します。 UnixとLinuxの回答ます。
Unix&Linux answerの$PWD
(私に向けられていない)答えてくれたTerdonに感謝します。
コメントで参照される以下の元の回答
ショートフォーム:
$ cd /
$ sudo updatedb
$ printf "Number Files: " && locate -cr "$PWD.*\.c$"
Number Files: 3523
$ printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Dirs.: 648
sudo updatedb
ファイルが今日作成された場合、または今日ファイルを削除した場合、locate
コマンドで使用されるデータベースを更新します。.c
.c
locate -cr "$PWD.*\.c$"
.c
現在のディレクトリとその子($PWD
)内のすべてのファイルを見つけます。ファイル名を印刷する代わりに、-c
引数を使用してカウントを印刷します。r
指定は、デフォルトの代わりにregexで*pattern*
あまりにも多くの結果を得ることができるマッチング。
locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
。*.c
現在のディレクトリ以下にあるすべてのファイルを見つけます。sed
ディレクトリ名のみを残してファイル名を削除します。を使用して、各ディレクトリ内のファイル数をカウントしuniq -c
ます。でディレクトリの数を数えるwc -l
ます。
ワンライナーで現在のディレクトリから開始
$ cd /usr/src
$ printf "Number Files: " && locate -cr "$PWD.*\.c$" && printf "Number Dirs.: " && locate -r "$PWD.*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l
Number Files: 3430
Number Dirs.: 624
ファイル数とディレクトリ数がどのように変化したかに注目してください。すべてのユーザーが/usr/src
ディレクトリをインストールされているカーネルの数に応じて異なるカウントで上記のコマンドを実行できるとます。
長い形式:
あなたがどれだけ速く見ることができるように長い形式は、時間が含まれてlocate
終わりましたfind
。実行しなければならない場合でもsudo updatedb
、1つよりも何倍も高速ですfind /
。
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ sudo time updatedb
0.58user 1.32system 0:03.94elapsed 48%CPU (0avgtext+0avgdata 7568maxresident)k
48inputs+131920outputs (1major+3562minor)pagefaults 0swaps
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Files: " && locate -cr $PWD".*\.c$")
Number Files: 3523
real 0m0.775s
user 0m0.766s
sys 0m0.012s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate -r $PWD".*\.c$" | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 648
real 0m0.778s
user 0m0.788s
sys 0m0.027s
───────────────────────────────────────────────────────────────────────────────────────────
注:これは、上のすべてのファイルであるALLのドライブとパーティション。つまり、Windowsコマンドも検索できます。
$ time (printf "Number Files: " && locate *.exe -c)
Number Files: 6541
real 0m0.946s
user 0m0.761s
sys 0m0.060s
───────────────────────────────────────────────────────────────────────────────────────────
rick@alien:~/Downloads$ time (printf "Number Dirs.: " && locate *.exe | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Dirs.: 3394
real 0m0.942s
user 0m0.803s
sys 0m0.092s
3つのWindows 10 NTFSパーティションが自動的にマウントされています /etc/fstab
ます。Locateはすべてを知っていることに注意してください!
興味深いカウント:
$ time (printf "Number Files: " && locate / -c && printf "Number Dirs.: " && locate / | sed 's%/[^/]*$%/%' | uniq -c | wc -l)
Number Files: 1637135
Number Dirs.: 286705
real 0m15.460s
user 0m13.471s
sys 0m2.786s
286,705個のディレクトリにある1,637,135個のファイルをカウントするには15秒かかります。YMMV。
locate
コマンドの正規表現処理の詳細については(このQ&Aでは必要ないように見えますが、念のために使用してください)、これを読んでください。
最近の記事からの追加読書: