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 -r
interruptor.
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 sort
comando y le diría que use la quinta columna para ordenar.
ls -lR | grep '^-' | sort -k 5 -rn
-rn
significa 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 find
comando 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
/ sort
no es compatible -h
, reemplace con du -k
y sort -rn
. Tenga en cuenta que el tamaño y el uso del disco no son lo mismo.
du
da 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 -h
opció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 -ls
opció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 -li
algunas 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 , OL
para invertir el orden por longitud (tamaño del archivo, o
para orden ascendente, O
para 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 D
calificador global:
print -rl -- **/*(.DOL)
.OL
hacer? ¿Es eso parte del comando?
ls (GNU coreutils) 8.25
y zsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. ¿Funciona solo para ciertas versiones de ls
y 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 find
que debe hacer:
find . -type f -exec ls -lSd {} +
Esto "encuentra" todos los archivos en el directorio de trabajo actual ( .
). Para cada archivo encontrado, ls
se ejecuta un proceso para ordenar los objetos encontrados en orden de tamaño. El +
terminador del -exec
hace 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
sed
para cortar la producción
Agregando a la respuesta de Delh y al comentario de Stéphane Chazelas ...
find -print0
combinado con xargs -0
agrega 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 m
de du -sm
). Otros valores aceptados por du
son -k
para kilobytes, -g
para gigabytes. El uso -h
de la pantalla legible por humanos no es posible porque se romperá la clasificación.
Aquí hay una versión que utiliza sed
para agregar el M
megabyte:
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 d
solo 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
ncdu
en 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
).