$ find . -type d | while read d; do if [ $(ls -1 "$d" | wc -l) -lt 3 ]; then echo $d; fi; done
Suponha que comece em algum diretório no sistema de arquivos. Este diretório base tem muitos subdiretórios (não aninhados!). Cada um dos subdiretórios possui um número arbitrário de arquivos.
Como posso encontrar todos os diretórios com, por exemplo? menos de 3 arquivos dentro usando algum comando shell? O comando find tem algumas boas opções para lidar com o tamanho dos arquivos, mas não consegui encontrar nada sobre a contagem de arquivos.
Que tal isso:
for i in 'find /etc/ -type d '; do j='ls -1 $i | wc -l' ; if [ $j -le 3 ]; then echo "$i has about $j file(s)"; fi; done
Saída:
[root@kerberos ~]# for i in 'find /etc/ -type d '; do j='ls $i | wc -l' ; if [ $j -le 3 ]; then echo "$i has about $j file(s)"; fi; done
/etc/prelink.conf.d has about 0 file(s)
/etc/kdump-adv-conf has about 2 file(s)
/etc/kdump-adv-conf/kdump_initscripts has about 2 file(s)
/etc/kdump-adv-conf/kdump_sample_manifests has about 1 file(s)
/etc/openldap/slapd.d.backup has about 2 file(s)
/etc/openldap/ssl has about 2 file(s)
/etc/foomatic has about 2 file(s)
/etc/gtk-2.0 has about 2 file(s)
/etc/gtk-2.0/x86_64-redhat-linux-gnu has about 2 file(s)
. . etc
Eu tentei fazer isso dentro do -exec, mas fiquei impaciente e apenas canalizei a saída e a analisei.
EDIT: Tomou nota do uso Quantas de -1 e o incorporou ao meu script, já que você não pode assumir que a saída estará em uma única coluna. No entanto, deixei o operador menor que ou igual no script.