Respuestas:
Deberías usar un comando como este:
find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
find
: busca archivos en la ruta que deseas. Si no desea que sea recursivo y su find
implementación lo admite, debe agregarlo -maxdepth 1
justo antes de la -exec
opción.exec
: le dice al comando que se ejecute wc -l
en cada archivo.sort -rn
: ordena los resultados numéricamente en orden inverso. De mayor a menor.(que supone que los nombres de archivo no contienen caracteres de nueva línea).
wc
también imprimirá una total
línea, por lo que aquí también obtendrá una o más líneas "totales" a menos que solo haya un archivo . Puede canalizar grep /
para eliminarlos.
sort
orden
Probablemente la versión más simple si no necesita recursividad:
wc -l /group/book/four/word/*|sort -n
wc
cuenta líneas (opción -l
) en cada (pero oculto) ( *
) archivos debajo /group/book/four/word/
, y sort
ordena el resultado (a través de la tubería |
) numéricamente (opción -n
).
Alguien hizo un comentario a esta respuesta mencionando grep -rlc
, antes de suprimirla. De hecho, grep
es una gran alternativa, especialmente si necesita recursividad:
grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2
contará (opción -c
) recursivamente (opción -r
) líneas que coinciden ( grep
) '^'
(es decir, principio de líneas) en el directorio /group/book/four/word/
. Luego debe reemplazar los dos puntos por un espacio, por ejemplo, usando tr
, para ayudar sort
, que desea ordenar numéricamente (opción -n
) en la segunda columna (opción -k2
).
Actualización: Vea el comentario de Stephane sobre posibles limitaciones y cómo puede deshacerse de él tr
.
grep -c .
cuenta las líneas que contienen al menos un carácter válido. Use grep -c '^'
para contar todas las líneas (también contará los caracteres finales después de la última línea nueva con algunas grep
implementaciones). Tenga en cuenta que no todas las grep
implementaciones admiten -r
ay el comportamiento varía entre los que lo hacen. No necesita traducir :
s (dos puntos, no punto y coma) a espacios para sort
. Solo úsalo -t:
. Tenga en cuenta que eso supone que los nombres de archivo no contienen :
caracteres en blanco o de nueva línea.
wc
daría un total tan útil si pasas por varios caminos. Acoplando esa funcionalidad con el comodín y la tubería sort
está realmente limpio.
Con zsh
:
lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)
Definimos una nueva función de clasificaciónlines
que responde con el número de líneas en el archivo. Y usamos el o+lines
calificador glob que junto con n
(para ordenamiento numérico), define cómo se ordenan los resultados del glob. ( .
también agregado para verificar solo los archivos normales).
Eso no supone qué carácter pueden contener los nombres de archivo que no sean los archivos ocultos (los que comienzan con .
) se omiten. Agregue el D
calificador glob si también los quiere.
bash
solo ...
No especifica si también desea los archivos en cualquier subdirectorio de /group/book/four/word
. La find
solución en la respuesta de jherran descenderá a subdirectorios. Si eso no se desea, use el shell en su lugar:
for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Si los nombres de sus archivos pueden contener nuevas líneas, puede usar algo como:
for file in ./*; do
[ -f "$file" ] &&
printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'
Por último, si hace falta descender en subdirectorios, puede utilizar esto en bash
4 o superior:
shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n
Tenga en cuenta que las versiones bash
anteriores a 4.3 seguían enlaces simbólicos cuando descendían recursivamente el árbol de directorios (como zsh
's o tcsh
' s ***/*
).
Además, todas las soluciones anteriores ignorarán los archivos ocultos (aquellos cuyo nombre comienza con a .
, se usan shopt -s dotglob
para incluirlos) y también incluirán el recuento de líneas de enlaces simbólicos (que el find
enfoque no incluirá).
-xtype f
en GNU find o *(-.)
en zsh) y omitirá los archivos ocultos.
%lu
en printf
? Según recuerdo, eso significa un decimal largo sin signo, ¿es realmente necesario? ¿Por qué no tratar el número como una cadena? ¿Hace alguna diferencia?
0
lugar de la cadena vacía, lo cual es un poco mejor. Algunas implementaciones de ordenación funcionan con enteros sin signo, algunas con signo. %lu
Suena como la apuesta más segura, pero probablemente no importa como si tuvieras 2^31
líneas, de todos modos tomará años.
Si desea instalar fd
un buscador de archivos realmente rápido escrito en Rust (debe instalarlo, es genial tenerlo de todos modos)
fd --type=file . | xargs wc -l | sort -n
Básicamente fd
enumera los archivos, xargs pasará la lista de archivos wc
(representa el recuento de palabras, pero pasar -l hará que cuente las líneas) y finalmente se ordenará del menor número de líneas al mayor uso sort -n
.
ls -l
no da el número de líneas.ls -lS
ordena el archivo por tamaño con algunasls
implementaciones (el tamaño es el número de bytes en el contenido).