私は次のコマンドを持っています:
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
答え2
違いは、を使用すると-name
ファイルのデフォルト名だけが一致することです。からman find
:
-name pattern
Base of file name (the path with the leading directories
removed) matches shell pattern pattern. The metacharacters
(`*', `?', and `[]') match a `.' at the start of the base name
(this is a change in findutils-4.2.2; see section STANDARDS CON‐
FORMANCE below). <snip>
使用時に同様の動作を得るには、以下をls -Ra
使用する必要があります-regex
。
-regex pattern
File name matches regular expression pattern. This is a match
on the whole path, not a search. <snip>