特定の数のファイルを含むディレクトリを見つける


13

findコマンドでこれを行うことができることを望んでいましたが、マニュアルで私がやりたいことを行うためのテストを見ることができません。私が指定した数より少ない、多い、または正確にカウントを含む作業ディレクトリ内のディレクトリを見つけられるようにしたいと思います。

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

しかし残念ながら、そのようなオプションはありません。


「ls -al | wc -l | grep」のようなものを試してください
Vanadis 2013

回答:


16

これを試して、サブディレクトリ名とそれらに含まれるファイル/ディレクトリの数を取得することができます:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

すべてのサブディレクトリに対して同じことをしたい場合(再帰的検索)代わりにこれを使用してください:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

正確に10個のファイルがあるディレクトリを選択するには:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10以上:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10以下:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

ディレクトリ名のみを保持したい場合(たとえば、@ evilsoupが示唆するように、それを下流の別のプロセスにパイプしたい場合)、これを使用できます。

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'

1
質問者が出力を他の何かにパイプしたい場合に備えて、ファイル数(つまり、最後の空白で区切られた列)を切り取るためにawkコマンドを含めると役立つと思います。
evilsoup 2013

1
@evilsoupいいアイデアだね。
terdon 2013

ディレクトリ名の空白と特殊文字をサポートするため。シングルクォートとダブルクォートの使い方を逆にしてみてください。find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
HåvardGeithus '22

3

正確に $NUMファイルを含む直接のサブディレクトリを一覧表示します。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

含有する即時のサブディレクトリ一覧表示するには大きいより$NUMファイルを。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'

含有する即時のサブディレクトリ一覧表示するには、以下より$NUMファイルを。

find -maxdepth 2 -mindepth 2 -type f -printf '%h\0' | awk -v num="$NUM" 'BEGIN{RS="\0"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'

アイテムはnull文字\0で終了するため、改行またはその他の種類の空白を含むファイル名は正しく解釈されます。は、%h各ファイルのを印刷しますdirnameawk次に、配列を使用して各ディレクトリに遭遇した回数をカウントし、条件が満たされている場合はそれを出力します。

前述のコマンドはいずれも、ファイルを含まないディレクトリを表示しないことに注意してください。また、ファイルでは、リンク、ディレクトリ、ソケット、ブロック、名前付きパイプなどではなく、通常のファイルを指していることに注意してください。

私はこれをできるだけ簡単にしようとしました。再帰的なサブディレクトリまたはその中のファイルを検索する場合は、変更されたコマンドが必要です。それらをすべてリストするにはあまりに多くの可能性があります。


2

これを試して:

[`見つける。| wc -l` -eq 10] && echo "見つかった"

[`見つける。| wc -l` -gt 10] && echo "見つかった"

[`見つける。| wc -l` -lt 10] && echo "見つかった"

この例では、CURRENTディレクトリに正確に10個以上、10個未満、10個未満のファイル/ディレクトリが含まれているかどうかを確認できます。たくさんのディレクトリをチェックする必要がある場合は、ループを使用してください。


ソリューションでは現在のディレクトリ(.)もカウントされるため、それに応じて変更することもできます。
terdon 2013

私はこの答えの推力が好きです(私はシェルで物事を行うことに大食いだからです)不必要な呼び出しを回避するために、テストを使用するwc -l < <(printf %s\\n ./*)か、printf %s\\n ./* | wc -l内部にいる方がよいでしょうfind。これにより、@ terdonが指摘.した、結果に含まれる問題も回避されます。ただし、で始まるファイルを無視する問題にも遭遇します.。私はこれを解決するだろうshopt -s dotglob(グロブで始まるファイルを一致させるために.ではなく、...)。
evilsoup 2013

@terdonそれは重要ではありません。これは最終的な解決策ではなく、単なる例です。最終バージョンでは、-1、または10から11に変更できます。
2013

私は知っています、そしてその考えが良いので私は提案をしました。
terdon 2013

@ terdon。ありがとうございました。次のようなさまざまな要件が考えられます。ファイルのみをカウントし、ディレクトリ、リンク、ハードリンクはカウントしない。サブディレクトリ内のファイルを数えるかどうか。隠しファイル(.bashrcなど)を数えます... ...そうすれば、表現を自由にすることができます。:)
2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.