Cómo enumerar todos los archivos ordenados por tamaño
241
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.
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.
Stéphane Chazelas
1
Veo que -S tiene un orden de tamaño descendente, ¿qué pasa con el orden ascendente?
demongolem
3
Tras @ StéphaneChazelas, esto funciona para mí: 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.
user7543
¡Hola! ¿Podría explicar la + |sintaxis en + | sort -r -h?
(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:
Esto supone que la columna "grupo" (de -ls) no contiene ningún espacio (de ahí el parámetro -k 7), pero no es necesariamente el caso.
kolistivra el
1
¿por qué no simplemente hacer find ... -print0 | ordenar -zk7rn0?
Andre de Miranda
10
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:
lo que hace el .OLhacer? ¿Es eso parte del comando?
alpha_989
@ alpha_989, ver edición
Stéphane Chazelas
Gracias por la explicación, Stephane ... Sin embargo, por alguna razón ... el comando no funciona en mi estación de trabajo ... Estoy usando ls (GNU coreutils) 8.25y zsh 5.1.1 (x86_64-ubuntu-linux-gnu). ¿Funciona solo para ciertas versiones de lsy zsh?
alpha_989
@ alpha_989, ¿de qué manera no te funciona? Funciona para mí con esas mismas versiones y no hay nada en ese código que no hubiera funcionado en las versiones de hace 15 años al menos.
Stéphane Chazelas
9
La lista de archivos por tamaño ascendente sería:
ls -lSr
Las opciones son:
l: largo, muestra usuario detallado, grupo, otros atributos, fecha, etc.
S: pedidos listados por tamaño (descendiendo por defecto)
¿Te importaría explicar las opciones para mejorar la calidad de la respuesta?
Rui F Ribeiro
6
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.
+1 para usar la bandera -h para una salida amigable para los humanos.
computingfreak
2
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
}
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 / debian apt install ncdu), así como en osx ( brew install ncdu).
man ls
:-S sort by file size
Respuestas:
Simplemente use algo como:
Capital S .
Esto ordenará los archivos por tamaño.
Ver también:
man ls
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):
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: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.-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:
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 sufind
/sort
no es compatible-h
, reemplace condu -k
ysort -rn
. Tenga en cuenta que el tamaño y el uso del disco no son lo mismo.fuente
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.
(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 als -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:
fuente
Con zsh y GNU ls:
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:
Si solo desea la lista de archivos y no la salida detallada, simplemente haga lo siguiente:
Si desea incluir archivos ocultos (cuyo nombre comienza con un punto, excepto
.
y..
) y buscar también en directorios ocultos, agregue elD
calificador global:fuente
.OL
hacer? ¿Es eso parte del comando?ls (GNU coreutils) 8.25
yzsh 5.1.1 (x86_64-ubuntu-linux-gnu)
. ¿Funciona solo para ciertas versiones dels
yzsh
?La lista de archivos por tamaño ascendente sería:
Las opciones son:
fuente
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: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 als
. 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.fuente
Visualización de la lista de archivos en orden inverso:
ls -lSrh
Para orden ascendente:
ls -lSh
fuente
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.fuente
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
fuente
sed
para cortar la producciónAgregando a la respuesta de Delh y al comentario de Stéphane Chazelas ...
find -print0
combinado conxargs -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 .
fuente
Como una variación de la pregunta original, si desea ver el tamaño acumulativo de los archivos en los subdirectorios:
Los tamaños se mostrarán en Megabytes (el
m
dedu -sm
). Otros valores aceptados pordu
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 elM
megabyte: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.fuente