146

私はすべてのディレクトリをリストすることができます

find ./ -type d

次のコマンドを使用して、各ディレクトリの内容を一覧表示し、各ディレクトリ内のファイルの数をカウントしようとしました

find ./ -type d | xargs ls -l | wc -l

しかし、これはによって返される行の総数を合計しました

find ./ -type d | xargs ls -l

各ディレクトリのファイル数を数える方法はありますか?

4

19 に答える 19

258

これにより、現在のディレクトリレベルのディレクトリごとのファイル数が出力されます。

du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
于 2016-09-21T17:26:19.617 に答える
143

GNUが見つかったと仮定して、ディレクトリを見つけて、残りをbashに任せます。

find . -type d -print0 | while read -d '' -r dir; do
    files=("$dir"/*)
    printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
于 2013-03-05T10:40:55.910 に答える
71
find . -type f | cut -d/ -f2 | sort | uniq -c
  • find . -type ffile現在のフォルダとサブフォルダで、タイプのすべてのアイテムを検索するには
  • cut -d/ -f2特定のフォルダを切り取る
  • sortフォルダ名のリストを並べ替える
  • uniq -c各フォルダ名がカウントされた回数を返す
于 2019-01-22T10:06:05.330 に答える
20

すべてのファイルを検索し、ファイル名を削除して、各ファイルのディレクトリ名だけを含む行を残し、各ディレクトリが表示される回数を数えるように調整できます。

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番目の置換は、現在のディレクトリにあるファイルを直接キャプチャします。それらは最後にスラッシュがなく、それらは。に置き換えられ./ます。並べ替えとカウントは、名前の数だけで機能します。

于 2013-03-05T05:27:12.763 に答える
14

これを行う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
于 2013-03-05T05:29:15.897 に答える
12

代わりに使用するSebastianの回答のわずかに変更されたバージョン(実行する必要があり、決して使用されないファイルサイズ関連のオーバーヘッドを除外するため):finddudu

 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 .
于 2018-07-23T13:00:31.030 に答える
8

他のすべてのソリューションには、何らかの欠点があります。

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 {} ';':ディレクトリごとに、ファイル名に設定および設定して$0shこのスクリプトフラグメントを実行します。$1
  • printf "%s " "$1":移植可能かつ最小限にディレクトリ名を出力し、その後にスペースのみを出力し、改行は出力しません。
  • ls -1UA:ファイルを1行に1つずつ、ディレクトリ順にリストします(パイプのストールを回避するため)。ただし特別なディレクトリ...
  • wc -l:行を数える
于 2016-09-21T19:14:49.350 に答える
6

これは、findの代わりにlsをループすることでも実行できます。

for f in */; do echo "$f -> $(ls $f | wc -l)"; done

説明:

for f in */;-すべてのディレクトリをループします

do echo "$f ->-各ディレクトリ名を出力します

$(ls $f | wc -l)-このディレクトリに対してlsを呼び出し、行をカウントします

于 2017-07-16T21:21:02.057 に答える
5

これにより、ディレクトリ名に続いてディレクトリ内のファイル数が返されます。

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関数の実行が許可されておらず、現在のスコープで定義されている関数を新しいシェルに明示的にエクスポートする必要があるため、が必要です。-execfind

于 2013-03-05T05:24:15.743 に答える
2

@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での私の最初の答え、そしてそれが誰かを助けることができることを願っています^ _ ^

于 2018-11-17T11:54:54.050 に答える
2

これは、ディレクトリ構造を参照して詳細な結果を提供する別の方法である可能性があります。

find . -type d  | awk '{print "echo -n \""$0"  \";ls -l "$0" | grep -v total | wc -l" }' | sh 
于 2019-11-20T20:12:53.073 に答える
1

探す 。-type f -printf'%h \ n'| 並べ替え| uniq -c

たとえば:

  5 .
  4 ./aln
  5 ./aln/iq
  4 ./bs
  4 ./ft
  6 ./hot
于 2017-07-02T21:51:20.060 に答える
1

ここで他のいくつかを試してみましたが、ファイルだけが必要な場合は、ファイル数にサブフォルダーが含まれることになりました。これ./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
于 2017-11-02T23:10:06.910 に答える
1

私の答えは少し異なります。検索のオプションがあるため、実際にははるかに柔軟になります。ちょうど試して:

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のすべてのバージョンで使用できるとは限らないことに注意してください。

于 2022-02-10T19:43:19.780 に答える
0

これにより、全体の数がわかります。

for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'
于 2018-05-20T11:21:52.743 に答える
0

特定のタイプのファイルを再帰的に見つける簡単な方法。この場合、現在のディレクトリ内のすべてのフォルダの.jpgファイルは次のとおりです。

find . -name *.jpg -print | wc -l

于 2018-12-27T12:37:53.427 に答える
0

超高速の奇跡コマンド。ファイルを再帰的にトラバースして、ディレクトリ内の画像の数をカウントし、画像の拡張子ごとに出力を整理します。

find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'

クレジット:https ://unix.stackexchange.com/a/386135/354980

于 2019-08-08T08:41:24.383 に答える
0

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 /エディタの除外パスに追加する必要があります。他のファイル数は、理想的には最大数を超えないようにする必要があります(ただし、変更できます)。

于 2020-08-15T10:22:53.227 に答える
-2

なぜ複雑なコマンドなのか。次のようなものを使用してください

find whatever_folder | wc -l
于 2021-08-16T15:39:33.203 に答える