lsを使用する代わりに「find」を使用するとどうなりますか?

lsを使用する代わりに「find」を使用するとどうなりますか?

私は次のコマンドを持っています:

ls -Ra | grep -cve/ -e'^\.*$'

私も同じことをしたいfind

これを試しましたが、find . -name "^\.*$" -o -print | wc -l 問題は、次のように新しいファイルを作成するとtouch "^.*$" 同じ方法で動作しないことです。

同じように動作するように変更する方法についてのアイデアはありますか?

ベストアンサー1

質問

何してるの?私が理解できるようにコマンドを説明しましょう。

ls -Ra | grep -cve/ -e'^\.*$'あなたに与えるでしょう:

  • ファイル、ディレクトリ、シンボリックリンクの数...
  • 現在のディレクトリを含める
  • 名前がドットのみで構成されるファイルを除外します。 touch '...' (!!!)

解決策

やりたいならまったく同じを使用すると、find次のことができます。

find . -not -regex '^\.+$' | wc -l

2つ以上のポイントを持つファイルがエラーの場合:

find . | wc -l

または(理論的には)次の「ls」方式を使用してください。a大文字を使用すると、現在のディレクトリと親ディレクトリは印刷されません。

ls -RA | grep -cve/ -e^\$

時間管理に関するいくつかのアドバイス

               except multidots    all files    number of files
  ls /home                0.75s        0.70s            ~330000
find /home                0.50s        0.50s            ~330000
  ls /                    2.50s        2.50s           ~1350000
find /                    1.90s        1.70s           ~1350000
  ls / [BSD]             10.00s        8.50s            ~250000
find / [BSD]              7.50s        7.50s            ~250000

ご覧のとおり、照会はほぼ常に高速です。しかし、まだ最適化していません!

-fソートをスキップするオプションを追加して、ls処理速度を約30%向上させました(結果的に1.60秒for)は最速のコマンドの1つ/です。ls -RAf | grep -cve/ -e^\$しかし、FreeBSDには何の影響もないようです...

知っておくと良いこと:BSD(この場合FreeBSD)で複数の点を確認するときの極端な時間差は、主に次のような方法に由来します。GNU Grepが動作し、より高速です。
BSDとLinuxの時間が長くなるのは、私がテストしたBSDシステムがはるかに遅いことであるかもしれませんし、他のファイルシステムを使うからかもしれません。

長い話を短く

標準ツールを使用してディレクトリ内のすべてのファイルシステムノードの数を取得するLinuxの最速のコマンドは次のとおりです。

ls -RAf | grep -cve/ -e^\$

FreeBSDでより速い(実際に質問に対する答えでもある)、より短いコマンドは次のとおりです。

find . | wc -l

おすすめ記事