私のLinuxマシンには本当に深いディレクトリツリーがあります。すべてのサブディレクトリを含め、そのパス内のすべてのファイルを数えたいと思います。
たとえば、次のディレクトリツリーがあるとします。
/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/
/home
を渡した場合、4つのファイルが返されます。または、4つのファイルと2つのディレクトリが返された場合にはボーナスポイントです。基本的に、Windowsでフォルダを右クリックしてプロパティを選択し、そのフォルダに含まれるファイル/フォルダの数を確認するのと同じことが必要です。
これを最も簡単に行う方法はありますか。私が書いたPythonスクリプトを使用した解決策がありますが、ls | wc
を実行するのと同じくらい簡単ではないのはなぜですか?
find . -type f | wc -l
説明:find . -type f
は、この(。)ディレクトリ内のすべてのファイル( - type f)を検索します。そしてすべてのサブディレクトリで、ファイル名は1行に1つずつ標準出力に出力されます。
次にこれをパイプで|wc
(Word count)にします。-l
オプションはwcにその入力の行だけを数えるように指示します。
一緒に彼らはあなたのすべてのファイルを数えます。
上記の答えはすでに質問に答えていますが、引数なしでfindを使用する場合(検索を実行するフォルダを除く)は、次のように追加します。
find . | wc -l
検索ははるかに速く、ほとんど瞬時に、あるいは少なくとも私にとってはうまくいきます。これは、type句がその名前をチェックするために各名前に対してstat()システムコールを実行しなければならないためです。
これはファイルだけではなくファイルとフォルダの数を返すという違いがありますが、少なくとも私がこれを使用して、コピーと圧縮に永遠にかかるファイルの量が大きいフォルダを見つけるために十分です。フォルダを数えることで、ほとんどのファイルを含むフォルダを見つけることができます。精度よりも速度が必要です。
ファイルの場合
find -type f | wc -l
ディレクトリの場合:
find -mindepth 1 -type d | wc -l
どちらも現在の作業ディレクトリで動作します。
あなたがdirなどの数が欲しいなら、受け入れられた答えへのわずかな更新
find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Bash 4以上
shopt -s globstar
for file in **/*
do
if [ -d "$file" ];then
((d++))
Elif [ -f "$file" ];then
((f++))
fi
done
echo "number of files: $f"
echo "number of dirs: $d"
ファイルやディレクトリを検索したい場合は、findを2回呼び出す必要はありません。