Puede probar esto para obtener los nombres de los subdirectorios y la cantidad de archivos/directorios que contienen:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Si desea hacer lo mismo para todos los subdirectorios (búsqueda recursiva), use esto en su lugar:
find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;
Para seleccionar aquellos directorios que tienen exactamente 10 archivos:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF==10'
10 o más:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF>=10'
10 o menos:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; |
awk '$NF<=10'
Si desea mantener solo el nombre del directorio (por ejemplo, si desea canalizarlo a otro proceso posterior como sugirió @evilsoup), puede usar esto:
find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; |
awk -F"\t" '$NF<=10{print $1}'
Para listar subdirectorios inmediatos que contienen exactamente $NUM
archivos.
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}'
Para listar subdirectorios inmediatos que contienen mayor que $NUM
archivos.
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}'
Para listar subdirectorios inmediatos que contienen menos que $NUM
archivos.
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}'
Los elementos terminan con un carácter nulo \0
, por lo que los nombres de archivo que contienen saltos de línea u otros tipos de espacios en blanco se interpretarán correctamente. El %h
imprime el dirname
de cada archivo . awk
luego usa una matriz para contar cuántas veces encuentra cada directorio, imprimiéndolo si se cumplen las condiciones.
Tenga en cuenta que ninguno de los comandos mencionados anteriormente mostrará directorios que contengan cero archivos. También tenga en cuenta que por archivo me refiero a archivos regulares, no enlaces, directorios, sockets, bloques, canalizaciones con nombre, etcétera.
He intentado hacer esto de la forma más sencilla posible. Si desea encontrar subdirectorios recursivos o los archivos que contienen, se requiere un comando modificado. Hay demasiadas posibilidades para enumerarlas todas.
Prueba esto:
[`encontrar. | wc -l` -eq 10 ] &&echo "Encontrado"
[`encontrar. | wc -l` -gt 10 ] &&echo "Encontrado"
[`encontrar. | wc -l` -lt 10 ] &&echo "Encontrado"
En estos ejemplos, puede verificar si el directorio ACTUAL contiene exactamente 10, más de 10 y menos de 10 archivos/directorios. Si necesita verificar un montón de directorios, simplemente use loop.