Me gustaría enumerar todos los archivos en el orden de tamaño grande a pequeño y los archivos podrían estar presentes en cualquier lugar de una carpeta determinada.
man ls:-S sort by file size
Me gustaría enumerar todos los archivos en el orden de tamaño grande a pequeño y los archivos podrían estar presentes en cualquier lugar de una carpeta determinada.
man ls:-S sort by file size
Respuestas:
Simplemente use algo como:
ls -lS /path/to/folder/
Capital S .
Esto ordenará los archivos por tamaño.
Ver también:
-S sort by file size
Si desea ordenar en orden inverso , simplemente agregue el -rinterruptor.
Actualizar:
Para excluir directorios (y siempre que ninguno de los nombres de archivo u objetivos de enlaces simbólicos contengan caracteres de nueva línea):
ls -lS | grep -v '^d'
Actualización 2:
Ahora veo cómo todavía muestra enlaces simbólicos, que podrían ser carpetas. Los enlaces simbólicos siempre comienzan con una letra l, como en el enlace.
Cambie el comando para filtrar por a -. Esto solo debería dejar archivos regulares:
ls -lS | grep '^-'
En mi sistema, esto solo muestra archivos normales.
actualización 3:
Para agregar recursividad, dejaría la clasificación de las líneas al sortcomando y le diría que use la quinta columna para ordenar.
ls -lR | grep '^-' | sort -k 5 -rn
-rnsignifica Inverso y numérico para obtener los archivos más grandes en la parte superior. La desventaja de este comando es que no muestra la ruta completa de los archivos.
Si necesita la ruta completa de los archivos, use algo como esto:
find . -type f -exec du -h {} + | sort -r -h
El findcomando buscará recursivamente todos los archivos en todos los subdirectorios .y llamará du -h(lo que significa que el uso del disco es legible ) y luego ordenará la salida nuevamente. Si su find/ sortno es compatible -h, reemplace con du -ky sort -rn. Tenga en cuenta que el tamaño y el uso del disco no son lo mismo.
duda el uso del disco que es diferente del tamaño del archivo. Con (GNU) du -h, la ordenación numérica no funcionará (necesitará la -hopción GNU para ordenar). xargs espera una lista de palabras posiblemente citadas como entrada, por lo que no funcionará si los nombres de archivo contienen espacios en blanco o caracteres entre comillas.
find . -type f -print0 | xargs -0 du -h | sort -rh. Si lo que desea es decir los mayores de 30 archivos: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
+ |sintaxis en + | sort -r -h?
Podrías usar algo como buscar y ordenar.
find . -type f -ls | sort -r -n -k7
(la -lsopción no es estándar, pero se encuentra en muchas implementaciones de búsqueda, no solo en GNU. En GNU find y otras, muestra algo similar a ls -lialgunas excepciones, por ejemplo, los archivos con ACL no están marcados con un +)
Si los nombres de archivo pueden contener caracteres de nueva línea, con GNU find y GNU sort:
find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'
Con zsh y GNU ls:
ls -ldU -- **/*(.OL)
Donde (.OL)hay un calificador global , .para seleccionar solo archivos regulares , OLpara invertir el orden por longitud (tamaño del archivo, o para orden ascendente, Opara descendente).
(tenga en cuenta que las versiones anteriores de zsh tenían problemas con los tamaños de archivo superiores a 2 ^ 32).
Algunos sistemas operativos tienen un límite en el tamaño de la lista de argumentos que se pasa a un comando. En esos casos, necesitarías:
autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU
Si solo desea la lista de archivos y no la salida detallada, simplemente haga lo siguiente:
print -rl -- **/*(.OL)
Si desea incluir archivos ocultos (cuyo nombre comienza con un punto, excepto .y ..) y buscar también en directorios ocultos, agregue el Dcalificador global:
print -rl -- **/*(.DOL)
.OLhacer? ¿Es eso parte del comando?
ls (GNU coreutils) 8.25y zsh 5.1.1 (x86_64-ubuntu-linux-gnu). ¿Funciona solo para ciertas versiones de lsy zsh?
La lista de archivos por tamaño ascendente sería:
ls -lSr
Las opciones son:
Decir que "los archivos podrían estar presentes en cualquier lugar de una carpeta determinada" implica que desea descender recursivamente todos los directorios (carpetas) dentro del directorio (carpeta) de inicio. Esto es lo findque debe hacer:
find . -type f -exec ls -lSd {} +
Esto "encuentra" todos los archivos en el directorio de trabajo actual ( .). Para cada archivo encontrado, lsse ejecuta un proceso para ordenar los objetos encontrados en orden de tamaño. El +terminador del -exechace que se pasen múltiples argumentos como una lista a ls. A menos que su directorio (carpeta) contenga una gran cantidad de archivos, debe tener una lista (y, por lo tanto, un proceso bifurcado), que conduzca al resultado que desea.
Visualización de la lista de archivos en orden inverso: ls -lSrh
Para orden ascendente: ls -lSh
Escribí algo en este sentido hace un tiempo. Podrías pasar un argumento para especificar cuántos archivos listar, o simplemente escribir big, en cuyo caso obtienes 10.
big () {
NUM_FILES=10;
if [ $1 ]; then
NUM_FILES=$1;
fi;
du | sort -nr | head -n $NUM_FILES
}
Prueba estos, funciona bien para mí.
$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10
# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'
Sin embargo, no es una respuesta perfecta, pero funciona hasta cierto punto
$ ls -lS |grep '^-' | head -n 6
sedpara cortar la producción
Agregando a la respuesta de Delh y al comentario de Stéphane Chazelas ...
find -print0combinado con xargs -0agrega soporte para espacios en blanco / espacios / whatnots.
du -h | sort -rn no se ordena correctamente entre diferentes bytes, por ejemplo, 1.1M se mostrará después de 128K, lo cual es incorrecto.
sort -rh (--human-numeric-sort) se encarga de eso, pero solo funciona en la versión de GNU.
Los siguientes comandos proporcionarán la salida deseada.
Legible por humanos, en GNU's sort / Linux:
find . -type f -print0 | xargs -0 du -h | sort -rh
En unidades de kilobytes, en BSD / OSX / otros:
find . -type f -print0 | xargs -0 du -k | sort -rn
Para BSD / OSX, consulte también https://unix.stackexchange.com/a/188375/82895 .
Como una variación de la pregunta original, si desea ver el tamaño acumulativo de los archivos en los subdirectorios:
#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr
Los tamaños se mostrarán en Megabytes (el mde du -sm). Otros valores aceptados por duson -kpara kilobytes, -gpara gigabytes. El uso -hde la pantalla legible por humanos no es posible porque se romperá la clasificación.
Aquí hay una versión que utiliza sedpara agregar el Mmegabyte:
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'
El directorio para mostrar se establece mediante el ${1:-.}cual usará el primer argumento de línea de comando si se proporciona, o usará el directorio actual si se llama sin argumentos.
NOTA: Esto puede llevar mucho tiempo con muchos archivos. La opción -type dsolo enumerará subdirectorios y excluirá archivos en la carpeta actual; si también desea ver los archivos en la carpeta actual, elimínelos.
Nota: es posible que desee utilizar
ncduen su lugar el que está disponible en la mayoría de los repositorios de Linux (en ubuntu / debianapt install ncdu), así como en osx (brew install ncdu).