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 find
y 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 find
comando imprime el directorio de todos los archivos en la jerarquía y uniq
solo muestra los directorios que aparecen al menos dos veces.
find
. En este caso, porque GNUfind
destrozará 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,
-print
haráfind
que se imprima la ruta al directorio.Para considerar también los archivos ocultos (archivos cuyos nombres comienzan con un punto), cambie la
sh -c
secuencia de comandos de decira
Pruebas:
fuente
[ "" -ge 2 ]
es una prueba válida.dash
,bash --posix
ytest
todos muestran un mensaje de error y salen con 2 (es decir, "Se produjo un error")ksh
funcionaba 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
test
losdir2
directorios y en mi configuración de prueba (ver mi respuesta).test/x1
ytest/x2
como archivos también ...$1
y$2
será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)
-count
se 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