私はすべてのディレクトリをリストすることができます
find ./ -type d
次のコマンドを使用して、各ディレクトリの内容を一覧表示し、各ディレクトリ内のファイルの数をカウントしようとしました
find ./ -type d | xargs ls -l | wc -l
しかし、これはによって返される行の総数を合計しました
find ./ -type d | xargs ls -l
各ディレクトリのファイル数を数える方法はありますか?
これにより、現在のディレクトリレベルのディレクトリごとのファイル数が出力されます。
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
GNUが見つかったと仮定して、ディレクトリを見つけて、残りをbashに任せます。
find . -type d -print0 | while read -d '' -r dir; do
files=("$dir"/*)
printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
find . -type f | cut -d/ -f2 | sort | uniq -c
find . -type f
file
現在のフォルダとサブフォルダで、タイプのすべてのアイテムを検索するにはcut -d/ -f2
特定のフォルダを切り取るsort
フォルダ名のリストを並べ替えるuniq -c
各フォルダ名がカウントされた回数を返すすべてのファイルを検索し、ファイル名を削除して、各ファイルのディレクトリ名だけを含む行を残し、各ディレクトリが表示される回数を数えるように調整できます。
find . -type f |
sed 's%/[^/]*$%%' |
sort |
uniq -c
この場合の唯一の落とし穴は、改行文字を含むファイル名またはディレクトリ名がある場合です。これはほとんどありません。ファイル名やディレクトリ名の改行について本当に心配する必要がある場合は、それらを見つけて、改行が含まれないように修正することをお勧めします(そして、有罪の当事者に彼らのやり方の誤りを静かに説得します)。
現在のディレクトリの各サブディレクトリにあるファイルの数に関心がある場合は、任意のサブディレクトリにあるファイルとそのすぐ下のサブディレクトリにあるファイルを数えます。このsed
コマンドを、印刷のみに適合させます。トップレベルディレクトリ:
find . -type f |
sed -e 's%^\(\./[^/]*/\).*$%\1%' -e 's%^\.\/[^/]*$%./%' |
sort |
uniq -c
最初のパターンは、名前の先頭、ドット、スラッシュ、次のスラッシュまでの名前、およびスラッシュをキャプチャし、行を最初の部分だけに置き換えます。
./dir1/dir2/file1
に置き換えられます
./dir1/
2番目の置換は、現在のディレクトリにあるファイルを直接キャプチャします。それらは最後にスラッシュがなく、それらは。に置き換えられ./
ます。並べ替えとカウントは、名前の数だけで機能します。
これを行う1つの方法がありますが、おそらく最も効率的ではありません。
find -type d -print0 | xargs -0 -n1 bash -c 'echo -n "$1:"; ls -1 "$1" | wc -l' --
このような出力を提供します。ディレクトリ名の後にそのディレクトリ内のエントリの数が続きます。出力カウントには、必要なものではない可能性のあるディレクトリエントリも含まれることに注意してください。
./c/fa/l:0
./a:4
./a/c:0
./a/a:1
./a/a/b:0
代わりに使用するSebastianの回答のわずかに変更されたバージョン(実行する必要があり、決して使用されないファイルサイズ関連のオーバーヘッドを除外するため):find
du
du
find ./ -mindepth 2 -type f | cut -d/ -f2 | sort | uniq -c | sort -nr
-mindepth 2
パラメータは、現在のディレクトリ内のファイルを除外するために使用されます。削除すると、次のような一連の行が表示されます。
234 dir1
123 dir2
1 file1
1 file2
1 file3
...
1 fileN
du
(ベースのバリアントと同じように)
現在のディレクトリ内のファイルもカウントする必要がある場合は、次の拡張バージョンを使用してください。
{ find ./ -mindepth 2 -type f | cut -d/ -f2 | sort && find ./ -maxdepth 1 -type f | cut -d/ -f1; } | uniq -c | sort -nr
出力は次のようになります。
234 dir1
123 dir2
42 .
他のすべてのソリューションには、何らかの欠点があります。
find -type d -readable -exec sh -c 'printf "%s " "$1"; ls -1UA "$1" | wc -l' sh {} ';'
説明:
-type d
:ディレクトリに関心があります。-readable
:ファイルをリストできる場合にのみ必要です。find
それらのディレクトリをさらに検索しようとするとエラーが発生することに注意してください。ただし、これにより-exec
、それらを呼び出すことができなくなります。-exec sh -c BLAH sh {} ';'
:ディレクトリごとに、ファイル名に設定および設定して$0
、sh
このスクリプトフラグメントを実行します。$1
printf "%s " "$1"
:移植可能かつ最小限にディレクトリ名を出力し、その後にスペースのみを出力し、改行は出力しません。ls -1UA
:ファイルを1行に1つずつ、ディレクトリ順にリストします(パイプのストールを回避するため)。ただし、特別なディレクトリ.
と..
wc -l
:行を数えるこれは、findの代わりにlsをループすることでも実行できます。
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
説明:
for f in */;
-すべてのディレクトリをループします
do echo "$f ->
-各ディレクトリ名を出力します
$(ls $f | wc -l)
-このディレクトリに対してlsを呼び出し、行をカウントします
これにより、ディレクトリ名に続いてディレクトリ内のファイル数が返されます。
findfiles() {
echo "$1" $(find "$1" -maxdepth 1 -type f | wc -l)
}
export -f findfiles
find ./ -type d -exec bash -c 'findfiles "$0"' {} \;
出力例:
./ 6
./foo 1
./foo/bar 2
./foo/bar/bazzz 0
./foo/bar/baz 4
./src 4
の引数では、bashを明示export -f
的に呼び出さない限り、bash関数の実行が許可されておらず、現在のスコープで定義されている関数を新しいシェルに明示的にエクスポートする必要があるため、が必要です。-exec
find
@glenn jackmanの回答と@pcarvalhoの回答を組み合わせました(コメントリストでは、文字'' `(バッククォート)の余分なスタイル制御機能のため、pcarvalhoの回答に問題があります)。
私のスクリプトは、パスを拡張として受け入れ、ディレクトリリストをとして並べ替えることができます。また、「ファイル名のスペース」の問題を処理することls -l
もできます。
#!/bin/bash
OLD_IFS="$IFS"
IFS=$'\n'
for dir in $(find $1 -maxdepth 1 -type d | sort);
do
files=("$dir"/*)
printf "%5d,%s\n" "${#files[@]}" "$dir"
done
FS="$OLD_IFS"
stackoverflowでの私の最初の答え、そしてそれが誰かを助けることができることを願っています^ _ ^
これは、ディレクトリ構造を参照して詳細な結果を提供する別の方法である可能性があります。
find . -type d | awk '{print "echo -n \""$0" \";ls -l "$0" | grep -v total | wc -l" }' | sh
探す 。-type f -printf'%h \ n'| 並べ替え| uniq -c
たとえば:
5 .
4 ./aln
5 ./aln/iq
4 ./bs
4 ./ft
6 ./hot
ここで他のいくつかを試してみましたが、ファイルだけが必要な場合は、ファイル数にサブフォルダーが含まれることになりました。これ./folder/path<tab>nnn
により、現在のフォルダー内の各サブフォルダーのファイル数(サブフォルダーを除く)が出力されます。
for d in `find . -type d -print`
do
echo -e "$d\t$(find $d -maxdepth 1 -type f -print | wc -l)"
done
私の答えは少し異なります。検索のオプションがあるため、実際にははるかに柔軟になります。ちょうど試して:
find . -type f -printf "%h\n" | sort | uniq -c
「-printf」の「%h」オプションを使用すると、findは検出したファイルのディレクトリのみを出力します。次に、「uniq-c」で並べ替えてカウントします。これにより、ディレクトリごとに、同じディレクトリにある検索結果エントリの数が出力されます。
検索でさらにオプションを使用すると、はるかに柔軟になります。たとえば、特定の日付にディレクトリが変更されたファイルの数の概要を取得するには、次を使用します。
find . -newermt "2022-01-01 00:00:00" -type f -printf "%TY-%Tm-%Td %h\n" | sort | uniq -c
これにより、2022年1月1日以降に変更されたすべてのファイルが検索され、変更日とディレクトリが( "-printf"を使用して)出力され、並べ替えられてカウントされます。この例では、結果の各行に、ファイルの数、変更日(時間なし)、およびディレクトリが含まれています。
「-printf」は、findのすべてのバージョンで使用できるとは限らないことに注意してください。
これにより、全体の数がわかります。
for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'
特定のタイプのファイルを再帰的に見つける簡単な方法。この場合、現在のディレクトリ内のすべてのフォルダの.jpgファイルは次のとおりです。
find . -name *.jpg -print | wc -l
超高速の奇跡コマンド。ファイルを再帰的にトラバースして、ディレクトリ内の画像の数をカウントし、画像の拡張子ごとに出力を整理します。
find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'
node_modules
分析したディレクトリ内のすべてのディレクトリを除外するために、スクリプトを編集しました。
これを使用して、プロジェクトのファイル数がファイルウォッチャーが処理できる最大数を超えているかどうかを確認できます。
find . -type d ! -path "*node_modules*" -print0 | while read -d '' -r dir; do
files=("$dir"/*)
printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
システムが監視できる最大ファイルを確認するには、次の手順に従います。
cat /proc/sys/fs/inotify/max_user_watches
node_modules
低速のシステムでは、フォルダをIDE /エディタの除外パスに追加する必要があります。他のファイル数は、理想的には最大数を超えないようにする必要があります(ただし、変更できます)。
なぜ複雑なコマンドなのか。次のようなものを使用してください
find whatever_folder | wc -l