Quiero saber cuántos archivos regulares tienen la extensión .c
en una estructura de directorio grande y compleja, y también cuántos directorios se distribuyen entre estos archivos. La salida que quiero es solo esos dos números.
He visto esta pregunta sobre cómo obtener la cantidad de archivos, pero también necesito saber la cantidad de directorios en los que están los archivos.
- Mis nombres de archivo (incluidos los directorios) pueden tener caracteres; pueden comenzar con
.
o-
y tener espacios o líneas nuevas. - Podría tener algunos enlaces simbólicos cuyos nombres terminan en
.c
, y enlaces simbólicos a directorios. No quiero que se sigan o cuenten los enlaces simbólicos, o al menos quiero saber si se están contando y cuándo. - La estructura de directorios tiene muchos niveles y el directorio de nivel superior (el directorio de trabajo) tiene al menos un
.c
archivo.
Escribí rápidamente algunos comandos en el shell (Bash) para contarlos yo mismo, pero no creo que el resultado sea exacto ...
shopt -s dotglob
shopt -s globstar
mkdir out
for d in **/; do
find "$d" -maxdepth 1 -type f -name "*.c" >> out/$(basename "$d")
done
ls -1Aq out | wc -l
cat out/* | wc -l
Esto genera quejas sobre redirecciones ambiguas, pierde archivos en el directorio actual y se tropeza con caracteres especiales (por ejemplo, la salida redirigida find
imprime nuevas líneas en los nombres de archivo ) y escribe un montón de archivos vacíos (Uy).
¿Cómo puedo enumerar de manera confiable mis .c
archivos y sus directorios que contienen?
En caso de que ayude, aquí hay algunos comandos para crear una estructura de prueba con nombres incorrectos y enlaces simbólicos:
mkdir -p cfiles/{1..3}/{a..b} && cd cfiles
mkdir space\ d
touch -- i.c -.c bad\ .c 'terrible
.c' not-c .hidden.c
for d in space\ d 1 2 2/{a..b} 3/b; do cp -t "$d" -- *.c; done
ln -s 2 dirlink
ln -s 3/b/i.c filelink.c
En la estructura resultante, 7 directorios contienen .c
archivos y 29 archivos regulares terminan con .c
(si dotglob
está desactivado cuando se ejecutan los comandos) (si he contado mal, hágamelo saber). Estos son los números que quiero.
Por favor, siéntase libre de no usar esta prueba en particular.
NB: Las respuestas en cualquier shell u otro idioma serán probadas y apreciadas por mí. Si tengo que instalar nuevos paquetes, no hay problema. Si conoces una solución GUI, te animo a compartir (pero podría no ir tan lejos como para instalar un DE completo para probarlo) :) Uso Ubuntu MATE 17.10.