Respuestas:
Suponiendo que desea un recuento recursivo de archivos solamente, no directorios y otros tipos, algo como esto debería funcionar:
find . -maxdepth 1 -mindepth 1 -type d | while read dir; do
printf "%-25.25s : " "$dir"
find "$dir" -type f | wc -l
done
find
... -print0 | xargs -0
....
bash
alias
!
sort -rn -k 2,2 -t$':'
obtienes la lista DESC
Esta tarea me fascinó tanto que quería encontrar una solución yo mismo. Ni siquiera toma un ciclo while y PUEDE ser más rápido en velocidad de ejecución. No hace falta decir que los esfuerzos de Thor me ayudaron mucho a entender las cosas en detalle.
Así que aquí está el mío:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "{} : $(find "{}" -type f | wc -l)" file\(s\)' \;
Parece modesto por una razón, porque es mucho más poderoso de lo que parece. :-)
Sin embargo, si tiene la intención de incluir esto en su .bash_aliases
archivo, debe verse así:
alias somealias='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '\''echo "{} : $(find "{}" -type f | wc -l)" file\(s\)'\'' \;'
Tenga en cuenta el manejo muy complicado de comillas simples anidadas . Y no, no es que no sea posible utilizar comillas dobles para el sh -c
argumento.
strace -fc script
. Su versión realiza aproximadamente un 70% más de llamadas al sistema. +1 para código más corto :-)
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
find . -type f | cut -d"/" -f2 | uniq -c
Enumera carpetas y archivos en la carpeta actual con un recuento de archivos que se encuentran debajo. OMI rápido y útil. (los archivos se muestran con el recuento 1).
| sort -rn
para ordenar subdirecciones por número de archivos.
Definitivamente, usar find es el camino a seguir si desea contar recursivamente, pero si solo desea contar los archivos directamente en un determinado directorio:
ls dir1 | wc -l
ls -d */ | xargs -n1 ls | wc -l
(Usar la respuesta que aceptar si ya funciona, aunque esto es sólo Y ahora usted sabe!.)
find
es tan importante. (y mucho menos , -print0
y xargs -0
ya lo señaló Scott en la otra respuesta)
find . -mindepth 1 -type d -print0 | xargs -0 -I{} sh -c 'printf "%4d : %s\n" "$(find {} -type f | wc -l)" "{}"'
A menudo necesito contar la cantidad de archivos en mis subdirectorios y usar este comando. Prefiero que el recuento aparezca primero.
Lo que uso ... Esto hace una matriz de todos los subdirectorios en el que da como parámetro. Imprima el subdirectorio y el recuento de ese mismo subdirectorio hasta que se procesen todos los subdirectorios.
#!/bin/bash
directories=($(/bin/ls -l $1 | /bin/grep "^d" | /usr/bin/awk -F" " '{print $9}'))
for item in ${directories[*]}
do
if [ -d "$1$item" ]; then
echo "$1$item"
/bin/ls $1$item | /usr/bin/wc -l
fi
done
Podrías usar este código de Python. Inicie el intérprete ejecutando python3
y pegue esto:
folder_path = '.'
import os, glob
for folder in sorted(glob.glob('{}/*'.format(folder_path))):
print('{:}: {:>8,}'.format(os.path.split(folder)[-1], len(glob.glob('{}/*'.format(folder)))))
O una versión recursiva para recuentos anidados:
import os, glob
def nested_count(folder_path, level=0):
for folder in sorted(glob.glob('{}/'.format(os.path.join(folder_path, '*')))):
print('{:}{:}: {:,}'.format(' '*level, os.path.split(os.path.split(folder)[-2])[-1], len(glob.glob(os.path.join(folder, '*')))))
nested_count(folder, level+1)
nested_count('.')
Salida de ejemplo:
>>> figures: 5
>>> misc: 1
>>> notebooks: 5
>>> archive: 65
>>> html: 12
>>> py: 12
>>> src: 14
>>> reports: 1
>>> content: 6
>>> src: 1
>>> html_download: 1