web-dev-qa-db-ja.com

システム上のファイル/フォルダーの総数を数えるには?

コマンドラインを使用して、システムに存在するすべてのファイル/フォルダーの数をカウントするにはどうすればよいですか?

/フォルダー全体のプロパティウィンドウを開くだけで、GUIを使用して確認できますが、コマンドラインを使用して実行する方法を知っておくと便利です。

一連のコマンド全体が必要ですか、それとも1つだけですか?

7
TellMeWhy

ファイル/フォルダー名には改行を含めることができるため:

Sudo find / -type f -printf '.' | wc -c
Sudo find / -type d -printf '.' | wc -c

これは、現在の/ディレクトリ内のany file/folderをカウントします。しかし、muruが指摘しているように、仮想/他のファイルシステムをカウントから除外したい場合があります(以下はany otherマウントされたファイルシステムを除外します):

find / -xdev -type f -printf '.' | wc -c
find / -xdev -type d -printf '.' | wc -c
  • Sudo find / -type f -printf '.'/の各ファイルにドットを出力します。
  • Sudo find / -type d -printf '.'/の各フォルダーにドットを印刷します。
  • wc -c:文字数をカウントします。

ファイル/フォルダー名の改行を処理しないと、他の方法(例: find / -type f | wc -lおよびfind / -type f -printf '.' | wc -cを使用して実際に正しい方法:

% ls
% touch "file
\`dquote> with newline"
% find . -type f | wc -l
2
% find . -type f -printf '.' | wc -c
1

STDOUTが端末でない場合、findは各ファイル/フォルダー名を文字通りに印刷します。これは、改行を含むファイル/フォルダー名が2つの異なる行にまたがって印刷され、wc -lが単一のファイル/フォルダーに対して2行をカウントし、最終的に結果を1つずつ印刷することを意味します。

11
kos

1つの方法は

Sudo find / -type f | wc -l
Sudo find / -type d | wc -l

(アクセスエラーを防ぐためのsudo)

ファイルの場合はf、ディレクトリの場合はd。

/ proc /ファイルシステムはエラーになりますが、これらのファイルは考慮しません;)

7
Rinzwind

ファイルシステム内のオブジェクトのtotal数が本当に必要な場合は、df -iを使用してiノードをカウントします。ディレクトリとプレーンファイルの内訳はわかりませんが、プラス側ではほぼ瞬時に実行されます。使用されるiノードの総数は、ファイルシステムがすでに追跡しているものです。


findベースの提案の1つを使用する場合は、/で実行しないでください。 find -xdevなどによって生成されたマウントポイントのリストでfindmnt --list -v -U -t xfs,ext3,ext4,btrfs,vfat,ntfs -o TARGETを使用します。ただし、バインドマウントは除外されないため、バインドマウント下のファイルは2回カウントされます。 findmntかなりクールです。

また、明示的なファイルシステムのタイプをリストすることなく、すべての「ディスク」マウントをリストする簡単な方法は確かにありますが、正確に何がわからないのですか。

別の回答で示唆されているように、find -printf . | wc -cを使用して、ファイル名に含まれる変な文字のカウントに関する問題を回避します。 -not -type dを使用して、ディレクトリ以外のファイルをカウントします。 (シンボリックリンクを除外したくないですか?)

5
Peter Cordes
Sudo find / -type f | wc -l

システム上の通常のファイルの数を教えてくれます。

Sudo find / -type d | wc -l

フォルダーの数。

4
Florian Diesch

zshを使用:

rootとして、通常のファイルの場合:

files=( /**/*(.D) )

これは、.で始まるものを含むすべての通常ファイルを配列filesに取り込みます。配列の要素の数を単純にカウントできます。

echo $#files

これにより、すべてのEdgeケースが処理されます。珍しいファイル名。

同様にディレクトリの場合:

dirs=( /**/*(/D) )
echo $#dirs
2
heemayl

locatedbを活用する別のアプローチ:

locate / | wc -l

利点:

  • 須藤は必要ありません
  • findベースのアプローチよりもはるかに高速です(既に事前にインデックス付けされています)
  • 既に適用されます-xdev:つまり、特殊ファイルをスキップします:/dev/procなど。

欠点:

  • 100%正確ではありません:ディレクトリを含み、/tmpの下のファイルをスキップし、名前に改行を含むファイルを2回以上カウントする場合があります。
  • df -iアプローチよりも遅い
  • 正確な現在の状態ではなく、「最後の〜24時間のスナップショットの現実」を反映
2
arielf