私はすべてのディレクトリをリストすることができます
find ./ -type d
次のコマンドを使用して、各ディレクトリの内容を一覧表示し、各ディレクトリ内のファイル数をカウントしようとしました
find ./ -type d | xargs ls -l | wc -l
しかし、これはによって返された行の総数を合計した
find ./ -type d | xargs ls -l
各ディレクトリのファイル数を数える方法はありますか?
私はすべてのディレクトリをリストすることができます
find ./ -type d
次のコマンドを使用して、各ディレクトリの内容を一覧表示し、各ディレクトリ内のファイル数をカウントしようとしました
find ./ -type d | xargs ls -l | wc -l
しかし、これはによって返された行の総数を合計した
find ./ -type d | xargs ls -l
各ディレクトリのファイル数を数える方法はありますか?
回答:
あなたがGNU findを持っていると仮定すると、ディレクトリを見つけさせ、残りをbashにさせましょう:
find . -type d -print0 | while read -d '' -r dir; do
files=("$dir"/*)
printf "%5d files in directory %s\n" "${#files[@]}" "$dir"
done
find . -maxdepth 1 -type d | sort
; y =を実行しfind $x | wc -l
ます。echo $ x、$ y; 完了
find . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
、空白を含むディレクトリ名を正しく処理するには、最初のコメントの引用符で囲む必要があります。:find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
これにより、現在のディレクトリレベルのディレクトリごとのファイル数が出力されます。
du -a | cut -d/ -f2 | sort | uniq -c | sort -nr
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
。追加| sort -nr
して、ディレクトリ名の代わりにカウントでソートします。
find . -type f | cut -d/ -f2 | sort | uniq -c
find. -type f
タイプファイルのすべてのアイテムを検索するにはcut -d/ -f2
特定のフォルダを切り取るsort
フォルダ名のリストをソートするuniq -c
各フォルダ名がカウントされた回数を返すfind . -type f | cut -d/ -f2,3 | 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番目の置換では、ファイルを現在のディレクトリに直接キャプチャします。末尾にスラッシュはなく、それらはに置き換えられ./
ます。ソートとカウントは、名前の数だけに作用します。
find
。ファイルdir1/dir2/dir3/file1
があるdir1/dir2
が、サブディレクトリしか含まれていない(プレーンファイルがない)場合は、その存在を推測できます。ただし、dir1/dir4
ファイルがない場合、その名前は表示されません。
これは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
bash
、ls
、wc
で見つかった各ディレクトリのため)find
。
man bash
、A -- signals the end of options and disables further option processing
。この場合、検索の一部として見つかった名前の誤ったファイルがbashの引数処理の一部になるのを防ぎます。
他のすべての人のソリューションには、いくつかの欠点があります。
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 -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
のわずかに変更されたバージョン (実行する必要があり、決して使用されないファイルサイズ関連のオーバーヘッドを除外するため)の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の代わりにlsをループして行うこともできます。
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
説明:
for f in */;
-すべてのディレクトリをループします
do echo "$f ->
-各ディレクトリ名を出力します
$(ls $f | wc -l)
-このディレクトリに対してlsを呼び出し、行を数える
for f ./* ; do echo $f $(ls "$f" | wc -l); done
これにより、ディレクトリ名に続いてディレクトリ内のファイル数が返されます。
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を明示的に呼び出さない限りbash関数の実行を許可せず、現在のスコープで定義されている関数を新しいシェルに明示的にエクスポートするexport -f
必要があるため、必須です。-exec
find
./dir1/dir2/dir3
ます(dir1
ファイルをdir1/dir2/dir3
個別にカウントするのではなく、ファイルとそのサブディレクトリを一緒にカウントするのではなくdir1/dir2
、両方で個別にカウントします/dir1
)。
@glenn jackmanの回答と@pcarvalhoの回答を組み合わせました(コメントリストでは、文字 ' ` '(バックティック)の余分なスタイル制御機能があるため、pcarvalhoの回答に問題があります)。
私のスクリプトは、としてaugumentとソートディレクトリのリストとしてパスを受け入れることができ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での私の最初の答え、そしてそれが誰かを助けることを願っています^ _ ^
超高速miracleコマンド。ファイルを再帰的に走査して、ディレクトリ内の画像の数をカウントし、画像の拡張子ごとに出力を整理します。
find . -type f | sed -e 's/.*\.//' | sort | uniq -c | sort -n | grep -Ei '(tiff|bmp|jpeg|jpg|png|gif)$'
これは、ディレクトリ構造を参照して詳細な結果を提供するもう1つの方法です。
find . -type d | awk '{print "echo -n \""$0" \";ls -l "$0" | grep -v total | wc -l" }' | sh
node_modules
分析したディレクトリ内のすべてのディレクトリを除外するためにスクリプトを編集しました。
これを使用して、ファイルのプロジェクト数がFile Watcherが処理できる最大数を超えているかどうかを確認できます。
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 /エディターで除外されたパスにフォルダーを追加する必要があり、他のファイル数が最大数を超えることは理想的ではありません(ただし、変更可能です)。
これにより、全体の数がわかります。
for file in */; do echo "$file -> $(ls $file | wc -l)"; done | cut -d ' ' -f 3| py --ji -l 'numpy.sum(l)'
./
か?