it-swarm-ja.com

特定の数のファイルを含むディレクトリを検索する

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

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

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

13
Paul Ruane

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

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}'
16
terdon

正確に$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}'

lessを含む直接のサブディレクトリを$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}'

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

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

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

3
Six

これを試して:

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

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

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

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

2
september