Esperaba poder hacer esto con el find
comando, pero no veo ninguna prueba en el manual para hacer lo que quiero. Me gustaría poder encontrar cualquier directorio en el directorio de trabajo que contenga menos que, más que o exactamente el recuento que especifico.
find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries
Pero, por desgracia, no existe tal opción.
Respuestas:
Puede intentar esto para obtener los nombres de los subdirectorios y la cantidad de archivos / directorios que contienen:
Si desea hacer lo mismo para todos los subdirectorios (búsqueda recursiva) use esto en su lugar:
Para seleccionar aquellos directorios que tienen exactamente 10 archivos:
10 o más:
10 o menos:
Si desea conservar solo el nombre del directorio (por ejemplo, si desea canalizarlo a otro proceso en sentido descendente, como sugiere @evilsoup), puede usar esto:
fuente
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
Para enumerar subdirectorios inmediatos que contienen exactamente
$NUM
archivos.Para enumerar subdirectorios inmediatos que contienen archivos mayores que
$NUM
.Para enumerar subdirectorios inmediatos que contienen menos de
$NUM
archivos.Los elementos terminan con un carácter nulo
\0
, por lo que los nombres de archivo que contienen líneas nuevas u otros tipos de espacios en blanco se interpretarán correctamente. Las%h
impresiones de cada archivodirname
.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 mostrará directorios que contengan cero archivos. También tenga en cuenta que por archivo me refiero a archivos normales, no a enlaces, directorios, tomas, bloques, tuberías con nombre, etc.
He tratado de hacer esto de la forma más simple posible. Si desea encontrar subdirectorios recursivos o los archivos que contiene, se requiere un comando modificado. Hay demasiadas posibilidades para enumerarlos a todos.
fuente
Prueba esto:
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.
fuente
.
), es posible que desee modificar en consecuencia.wc -l < <(printf %s\\n ./*)
oprintf %s\\n ./* | wc -l
dentro de la prueba, para evitar unafind
llamada innecesaria . Esto también evitará el problema que @terdon notó, de incluir.
en el resultado. Sin embargo, también se encontraría con el problema de ignorar los archivos que comienzan con a.
; Me gustaría resolver esto conshopt -s dotglob
(para hacer pegotes coinciden con los archivos que comienzan con una.
, pero no.
o..
).