find . -type d \
-exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' \
-print
Isto irá encontrar todos os nomes dentro ou fora do diretório atual e, em seguida, filtrará todos os nomes que não sejam nomes de diretórios.
Os nomes dos diretórios restantes serão dados a este pequeno script:
c=0
for n in "$1"/*; do
[ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 ))
done
[ "$c" -ge 2 ]
Este script contará o número de arquivos regulares (ignorando links simbólicos) no diretório fornecido como o primeiro argumento de linha de comando (de find
). O último comando no script é um teste para ver se a contagem era 2 ou maior. O resultado desse teste é o valor de retorno (status de saída) do script.
Se o teste for bem-sucedido, -print
fará com que find
imprima o caminho para o diretório.
Para também considerar arquivos ocultos (arquivos cujos nomes começam com um ponto), altere o script sh -c
dizendo
for n in "$1"/*; do
para
for n in "$1"/* "$1"/.*; do
Teste:
$ tree
.
'-- test
|-- a
|-- dir1
| |-- a
| |-- b
| '-- c
'-- dir2
|-- dira
|-- dirb
| |-- file-1
| '-- file-2
'-- dirc
6 directories, 6 files
$ find . -type d -exec sh -c 'c=0; for n in "$1"/*; do [ -f "$n" ] && [ ! -h "$n" ] && c=$(( c + 1 )); done; [ "$c" -ge 2 ]' sh {} ';' -print
./test/dir1
./test/dir2/dirb