Quiero encontrar un subdirectorio del directorio actual, que (ese es el subdirectorio) contiene 2 o más archivos regulares.
No estoy interesado en directorios que contengan menos de 2 archivos, ni en directorios que contengan solo subdirectorios.
Aquí hay un enfoque completamente diferente basado en GNU findy uniq. Esto es mucho más rápido y amigable con la CPU que las respuestas basadas en la ejecución de un comando de shell que cuenta archivos para cada directorio encontrado.
find . -type f -printf '%h\n' | sort | uniq -d
El findcomando imprime el directorio de todos los archivos en la jerarquía y uniqsolo muestra los directorios que aparecen al menos dos veces.
find. En este caso, porque GNUfinddestrozará los nombres de directorios que tienen caracteres que no se pueden imprimir en la configuración regional actual (como "ä" en la configuración regional en C). Consulte también unix.stackexchange.com/questions/321697/…-printf '%h\0' | sort -z | uniq -zd | xargs -r0 ...Esto encontrará todos los nombres dentro o debajo del directorio actual y luego filtrará todos los nombres que no sean nombres de directorios.
Los nombres de directorio restantes se darán a este breve script:
Este script contará el número de archivos regulares (omitiendo enlaces simbólicos) en el directorio dado como el primer argumento de línea de comando (desde
find). El último comando en el script es una prueba para ver si el recuento fue 2 o mayor. El resultado de esta prueba es el valor de retorno (estado de salida) del script.Si la prueba tuvo éxito,
-printharáfindque se imprima la ruta al directorio.Para considerar también los archivos ocultos (archivos cuyos nombres comienzan con un punto), cambie la
sh -csecuencia de comandos de decira
Pruebas:
fuente
[ "" -ge 2 ]es una prueba válida.dash,bash --posixytesttodos muestran un mensaje de error y salen con 2 (es decir, "Se produjo un error")kshfuncionaba comosh. Se enmendará de inmediato. ¡Gracias por molestarme! :-)[ -f ... ]referencia a enlaces simbólicos. Debe agregar una prueba para eliminarlos, ya que la pregunta especifica que solo se deben contar los archivos normales.Con la ayuda de la respuesta de Gilles sobre SU y su reversa y algunas modificaciones, aquí está lo que necesita.
Árbol de directorios.
Resultado:
fuente
testlosdir2directorios y en mi configuración de prueba (ver mi respuesta).test/x1ytest/x2como archivos también ...$1y$2serán directorios paratest, y se perderá el directorio.Otro enfoque
find+wc:path/currdir- ruta a su directorio actual-maxdepth 1- considere solo subcarpetas secundarias directas! -empty- ignorar subcarpetas vacías! -path "path/currdir"- ignorar la ruta actual del directoriocount=$(find "$1" -maxdepth 1 -type f | wc -l)-countse le asigna el número de archivos para cada subcarpeta encontrada[ $count -ge 2 ] ... -print- imprimir nombre / ruta de subcarpeta que contiene 2 o más archivos regularesfuente