Puoi provare questo, per ottenere i nomi delle sottodirectory e il numero di file/directory che contengono:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Se vuoi fare lo stesso per tutte le sottodirectory (ricerca ricorsiva) usa invece questo:
find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Per selezionare quelle directory che hanno esattamente 10 file:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF==10'
10 o più:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF>=10'
10 o meno:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF<=10'
Se vuoi mantenere solo il nome della directory (ad esempio se vuoi reindirizzarlo a un altro processo a valle come suggerito da @evilsoup) puoi usare questo:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; |
awk -F"\t" '$NF<=10{print $1}'
Per elencare le sottodirectory immediate contenenti esattamente $NUM
file.
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}'
Per elencare le sottodirectory immediate contenenti maggiore di $NUM
file.
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}'
Per elencare le sottodirectory immediate contenenti less di $NUM
file.
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}'
Gli elementi sono terminati da un carattere nullo \0
, quindi i nomi di file che contengono newline o altri tipi di spazio vuoto verranno interpretati correttamente. Il %h
stampa il dirname
di ciascun file . awk
quindi utilizza un array per contare quante volte incontra ogni directory, stampandolo se le condizioni sono soddisfatte.
Si noti che nessuno dei suddetti comandi visualizzerà directory contenenti zero file. Nota anche che per file mi riferisco a file regolari, non link, directory, socket, blocchi, named pipe, eccetera.
Ho cercato di farlo nel modo più semplice possibile. Se vuoi trovare sottodirectory ricorsive oi file in esse contenuti, è necessario un comando modificato. Ci sono troppe possibilità per elencarle tutte.
Prova questo:
[ `trova . | wc -l` -eq 10 ] &&echo "Trovato"
[ `trova . | wc -l` -gt 10 ] &&echo "Trovato"
[ `trova . | wc -l` -lt 10 ] &&echo "Trovato"
In questi esempi puoi verificare se la directory CURRENT contiene esattamente 10, più di 10 e meno di 10 file/directory. Se hai bisogno di controllare un mucchio di directory, usa semplicemente loop.