una - listar solo directorios linux
Usando ls para listar directorios y sus tamaños totales (22)
¿Es posible usar ls
en Unix para enumerar el tamaño total de un subdirectorio y todo su contenido en oposición a los 4K habituales que (supongo) es solo el archivo del directorio en sí? ES DECIR
total 12K
drwxrwxr-x 6 *** *** 4.0K 2009-06-19 10:10 branches
drwxrwxr-x 13 *** *** 4.0K 2009-06-19 10:52 tags
drwxrwxr-x 16 *** *** 4.0K 2009-06-19 10:02 trunk
Después de recorrer las páginas del manual, voy subiendo vacío.
El comando que desea es ''du -sk'' du = "uso de disco"
El indicador -k le da salida en kilobytes, en lugar del valor predeterminado de los sectores del disco (bloques de 512 bytes).
La marca -s solo mostrará una lista de las cosas en el directorio de nivel superior (es decir, el directorio actual, por defecto, o el directorio especificado en la línea de comandos). Es extraño que du tenga el comportamiento opuesto de ls en este sentido. Por defecto, du le dará recursivamente el uso del disco de cada subdirectorio. En contraste, ls solo proporcionará archivos de lista en el directorio especificado. (ls -R te da un comportamiento recursivo.)
Estas son todas buenas sugerencias, pero la que yo uso es:
du -ksh * | sort -n -r
-ksh
se asegura de que los archivos y las carpetas se enumeren en un formato legible para las personas y en megabytes, kilobytes, etc. Luego, los clasifica numéricamente e invierte la ordenación para que coloque primero los más grandes.
El único inconveniente de este comando es que la computadora no sabe que Gigabyte es más grande que Megabyte, por lo que solo se ordenará por números y, a menudo, encontrará listados como este:
120K
12M
4G
Sólo tenga cuidado de mirar la unidad.
Este comando también funciona en Mac (mientras que sort -h
no lo hace, por ejemplo).
Este es uno que me gusta
actualización : no me gustó la anterior porque no mostraba archivos en el directorio actual, solo listaba directorios.
Ejemplo de salida para /var
en ubuntu:
sudo du -hDaxd1 /var | sort -h | tail -n10
4.0K /var/lock
4.0K /var/run
4.0K /var/www
12K /var/spool
3.7M /var/backups
33M /var/log
45M /var/webmin
231M /var/cache
1.4G /var/lib
1.7G /var
Hmm, la mejor manera es usar este comando:
du -h -x / | sort -hr >> /home/log_size.txt
Entonces podrá obtener carpetas de todos los tamaños en todo su servidor. Fácil de ayudarte a encontrar los tamaños más grandes.
Intenta algo como:
du -sh *
versión corta de:
du --summary --human-readable *
Explicación:
du
: D isk U sage
-s
: muestra un resumen para cada archivo especificado. (Equivalente a -d 0
)
-h
: Salida "legible por humanos". Utilice los sufijos unitarios: B yte, K ibibyte (KiB), M ebibyte (MiB), G ibibyte (GiB), T ebibyte (TiB) y P ebibyte (PiB). (BASE2)
Lo siguiente es fácil de recordar
ls -ltrapR
listar los contenidos del directorio
-Utilizo un formato de listado largo
-tipo por tiempo de modificación, el más nuevo primero
-r, --verso inverso al ordenar
-a, --todos no ignoran las entradas que comienzan con.
-p, --indicator-style = barra agregada / indicador a directorios
-R, - lista de recursivos subdirectorios recursivamente
Me encontré con un problema similar al que describió Martin Wilde, en mi caso comparando el mismo directorio en dos servidores diferentes después de duplicar con rsync.
En lugar de usar un script, agregué el indicador -b
al du
que cuenta el tamaño en bytes y, hasta donde puedo determinar, eliminó las diferencias en los dos servidores. Aún puede usar -s -h
para obtener un resultado comprensible.
Para listar los directorios más grandes del directorio actual en formato legible por humanos:
du -sh * | sort -hr
Una mejor manera de restringir el número de filas puede ser
du -sh * | sort -hr | head -n10
Donde puede aumentar el sufijo de la bandera -n
para restringir el número de filas enumeradas
Muestra:
[~]$ du -sh * | sort -hr
48M app
11M lib
6.7M Vendor
1.1M composer.phar
488K phpcs.phar
488K phpcbf.phar
72K doc
16K nbproject
8.0K composer.lock
4.0K README.md
Lo hace más conveniente para leer :)
Para mostrar recursivamente los archivos y subdirectorios del directorio actual:
du -h .
Para mostrar la misma información de tamaño pero sin imprimir sus subdirectorios de forma recursiva (lo que puede ser una lista enorme), solo use la opción --max-depth :
du -h --max-depth=1 .
Para mostrarlo en formato ls -lh
, use:
(du -sh ./*; ls -lh --color=no) | awk ''{ if($1 == "total") {X = 1} else if (!X) {SIZES[$2] = $1} else { sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0); print $0} }''
Código Awk explicado:
if($1 == "total") { // Set X when start of ls is detected
X = 1
} else if (!X) { // Until X is set, collect the sizes from `du`
SIZES[$2] = $1
} else {
// Replace the size on current current line (with alignment)
sub($5 "[ ]*", sprintf("%-7s ", SIZES["./" $9]), $0);
print $0
}
Salida de muestra:
drwxr-xr-x 2 root root 4.0K Feb 12 16:43 cgi-bin
drwxrws--- 6 root www 20M Feb 18 11:07 document_root
drwxr-xr-x 3 root root 1.3M Feb 18 00:18 icons
drwxrwsr-x 2 localusr www 8.0K Dec 27 01:23 passwd
Ponga esta declaración de función de shell en sus scripts de inicialización de shell:
function duls {
paste <( du -hs -- "$@" | cut -f1 ) <( ls -ld -- "$@" )
}
Lo llamé duls
porque muestra la salida de ambos du
y ls
(en ese orden):
$ duls
210M drwxr-xr-x 21 kk staff 714 Jun 15 09:32 .
$ duls *
36K -rw-r--r-- 1 kk staff 35147 Jun 9 16:03 COPYING
8.0K -rw-r--r-- 1 kk staff 6962 Jun 9 16:03 INSTALL
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
4.0K -rw-r--r-- 1 kk staff 1689 Jun 9 16:03 README
120K -rw-r--r-- 1 kk staff 121585 Jun 10 13:26 aclocal.m4
684K drwxr-xr-x 7 kk staff 238 Jun 10 13:26 autom4te.cache
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
60K -rw-r--r-- 1 kk staff 60083 Jun 10 13:26 config.log
36K -rwxr-xr-x 1 kk staff 34716 Jun 10 13:26 config.status
264K -rwxr-xr-x 1 kk staff 266637 Jun 10 13:26 configure
8.0K -rw-r--r-- 1 kk staff 4280 Jun 10 13:25 configure.ac
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
2.3M drwxr-xr-x 28 kk staff 952 Jun 10 13:26 examples
6.2M -rw-r--r-- 1 kk staff 6505797 Jun 15 09:32 mrbayes-3.2.7-dev.tar.gz
11M drwxr-xr-x 42 kk staff 1428 Jun 10 13:26 src
$ duls doc
7.0M drwxr-xr-x 8 kk staff 272 Jun 10 13:26 doc
$ duls [bM]*
28K -rw-r--r-- 1 kk staff 24816 Jun 10 13:26 Makefile
4.0K -rw-r--r-- 1 kk staff 75 Jun 9 16:03 Makefile.am
24K -rw-r--r-- 1 kk staff 24473 Jun 10 13:26 Makefile.in
128K drwxr-xr-x 8 kk staff 272 Jun 9 16:03 build
Explicación:
La utilidad de paste
crea columnas a partir de su entrada de acuerdo con la especificación que le asigne. Dados dos archivos de entrada, los coloca uno al lado del otro, con una pestaña como separador.
Le damos la salida de du -hs -- "$@" | cut -f1
du -hs -- "$@" | cut -f1
como el primer archivo (flujo de entrada realmente) y la salida de ls -ld -- "$@"
como el segundo archivo.
En la función, "$@"
se evaluará en la lista de todos los argumentos de la línea de comandos, cada uno entre comillas dobles. Por lo tanto, comprenderá los caracteres globales y los nombres de ruta con espacios, etc.
El doble menos ( --
) señala las opciones de fin de línea de comando para du
y ls
. Sin esto, decir duls -l
confundiría du
y cualquier opción para du
que ls
no tenga confundiría a ls
(y las opciones que existen en ambas utilidades podrían no significar lo mismo, y sería un gran lío).
El cut
después de du
simplemente corta la primera columna de la salida du -hs
(los tamaños).
Decidí poner la salida du
a la izquierda, de lo contrario habría tenido que administrar una columna derecha tambaleante (debido a la longitud variable de los nombres de los archivos).
El comando no aceptará banderas de línea de comando.
Esto ha sido probado tanto en bash
como en ksh93
. No funcionará con /bin/sh
.
Por un tiempo, usé Nautilus (en el escritorio de Gnome en RHEL 6.0) para eliminar archivos en mi carpeta de inicio en lugar de usar el comando rm
en bash. Como resultado, el tamaño total mostrado por
du -sh
no coincidía con la suma de uso de disco de cada subdirectorio, cuando lo usé
du -sh *
Me tomó un tiempo darme cuenta de que Nautilus envía los archivos eliminados a su carpeta de la Papelera, y esa carpeta no aparece en el comando du -sh *
. Entonces, solo quería compartir esto, en caso de que alguien enfrentara el mismo problema.
Siempre utilizo du -sk
( du -sk
-k
que muestra el tamaño del archivo en kilobytes) en su lugar.
Solo una advertencia, si quieres comparar tamaños de archivos. Du produce diferentes resultados dependiendo del sistema de archivos, tamaño de bloque, ....
Puede suceder que el tamaño de los archivos sea diferente, por ejemplo, comparando el mismo directorio en su disco duro local y un dispositivo de almacenamiento masivo USB. Utilizo el siguiente script, incluido ls para resumir el tamaño del directorio. El resultado en bytes teniendo en cuenta todos los subdirectorios.
echo "[GetFileSize.sh] target directory: /"$1/""
iRetValue=0
uiLength=$(expr length "$1")
if [ $uiLength -lt 2 ]; then
echo "[GetFileSize.sh] invalid target directory: /"$1/" - exiting!"
iRetValue=-1
else
echo "[GetFileSize.sh] computing size of files..."
# use ls to compute total size of all files - skip directories as they may
# show different sizes, depending on block size of target disk / file system
uiTotalSize=$(ls -l -R $1 | grep -v ^d | awk ''{total+=$5;} END {print total;}'')
uiLength=$(expr length "$uiTotalSize")
if [ $uiLength -lt 1 ]; then
uiTotalSize=0
fi
echo -e "[GetFileSize.sh] total target file size: /"$uiTotalSize/""
fi
exit "$iRetValue"
du -sch * en el mismo directorio.
du -sm * | ordenar -nr
Salida por tamaño
escriba "ls -ltrh / path_to_directory"
mira du
comando para eso
du -sk * | sort -n
du -sk * | sort -n
ordenará las carpetas por tamaño. Útil para mirar al espacio libre.
du -S
Tengo otra opción útil: -S, --separate-dirs
diciéndole que no incluya el tamaño de los subdirectorios - útil en algunas ocasiones.
Ejemplo 1: muestra solo los tamaños de archivo en un directorio:
du -Sh *
3,1G 10/CR2
280M 10
Ejemplo 2: muestra los tamaños de archivo y los subdirectorios en el directorio:
du -h *
3,1G 10/CR2
3,4G 10
du -h --max-depth=1 . | sort -n -r
du -sh * | sort -h
Esto se mostrará en formato legible por humanos.