¿Cómo obtener el tamaño de la carpeta ignorando los enlaces duros?


16

Utilizo rsnapshot para copias de seguridad, que genera una serie de carpetas que contienen archivos con el mismo nombre. Algunos de los archivos están vinculados, mientras que otros están separados. Por ejemplo, hourly.1/file1y hourly.2/file1podría ser difícil relacionado con el mismo archivo, mientras que hourly.1/file2y hourly.2/file2son archivos totalmente independientes.

Quiero encontrar la cantidad de espacio utilizado por la carpeta hourly.2 ignorando los archivos que son enlaces duros a los archivos hourly.1. Entonces, en el ejemplo anterior, me gustaría obtener el tamaño del archivo2, pero ignorar el archivo1.

Estoy usando bash en linux, y quiero hacer esto desde la línea de comandos de la manera más simple posible, por lo que no hay grandes soluciones gráficas o de otro sistema operativo, por favor.

Respuestas:


7

Tamaño total en bytes de todos los archivos en los hourly.2que solo hay un enlace:

$ find ./hourly.2 -type f -links 1 -printf "%s\n" | awk '{s=s+$1} END {print s}'

De findla página del manual:

   -links n
          File has n links.

Para obtener la suma en kilobytes en lugar de bytes, use -printf "%k\n"

Para enumerar archivos con diferentes recuentos de enlaces, juegue con find -links +1(más de un enlace), find -links -5(menos de cinco enlaces) y así sucesivamente.


1
Si un archivo en algún lugar es un enlace duro a un archivo hourly2, su comando procederá con una respuesta incorrecta.
Cuonglm

@Gnouc - Bueno, sí, depende de cómo terminen los archivos hourly.2. Si se copian allí, no tendrán enlaces adicionales y mi comando funcionará. Si están vinculados, obviamente fallará. Supongo que se copian nuevos archivos de copia de seguridad.
grebneke

11

Si desea específicamente el tamaño de los archivos que están debajo hourly.2pero no debajo hourly.1, puede obtenerlo un poco indirectamente con du. Si duprocesa el mismo archivo más de una vez (incluso con nombres diferentes, es decir, enlaces duros), solo cuenta el archivo la primera vez. Entonces, lo que du hourly.1 hourly.2informa hourly.2es el tamaño que está buscando. Así:

du -ks hourly.1 hourly.2 | sed -n '2s/[^0-9]*//p'

(Funciona en cualquier sistema POSIX y en la mayoría de las otras variantes de Unix. Se supone que el nombre del directorio hourly.1no contiene ninguna línea nueva).


Por alguna extraña razón, du no siempre nota los archivos enlazados en RHEL5: si hago 'du -sh dir / sub dir', la salida para dir es la misma que si dijera 'du -sh dir', sin excluir el tamaño de 'dir / sub'.
Andreas Krey

8

Como dice @Gilles, dado que dusolo cuenta el primero de todos los enlaces duros que apuntan al mismo inodo que encuentra, puede asignarle directorios en una fila:

$ du -hc --max-depth=0 dirA dirB
29G /hourly.1
 1G /hourly.2
30G total

Es decir, cualquier archivo en 'hourly.2' que haga referencia a un inodo (también conocido como archivo "real") ya referenciado en 'hourly.1', no se contará.


2
Según du --help , la opción --max-depth = 0 es equivalente a -s , por lo que arriba se puede acortar como:$ du -hcs dirA dirB
akavel

1

Las compilaciones de Awesomely BusyBox findvienen sin -printfsoporte. Aquí hay una modificación a la respuesta de @ grebneke :

find . -type f -links 1 -exec ls -l {} \;| awk '{s=s+$5} END {print s}'

1

Más simple

du -hc --max-depth=1 path/

Ejemplo

9.4G    daily/users/rockspa/home/daily.21
3.6G    daily/users/rockspa/home/daily.30
4.2G    daily/users/rockspa/home/daily.11
1.1G    daily/users/rockspa/home/daily.4
4.2G    daily/users/rockspa/home/daily.9
3.0G    daily/users/rockspa/home/daily.25
3.5G    daily/users/rockspa/home/daily.20
4.2G    daily/users/rockspa/home/daily.13
913M    daily/users/rockspa/home/daily.5
2.8G    daily/users/rockspa/home/daily.26
1.4G    daily/users/rockspa/home/daily.1
2.6G    daily/users/rockspa/home/daily.28
4.2G    daily/users/rockspa/home/daily.15
3.8G    daily/users/rockspa/home/daily.19
327M    daily/users/rockspa/home/daily.8
4.2G    daily/users/rockspa/home/daily.17
3.1G    daily/users/rockspa/home/daily.23
...

Gracias abdel Esta debería ser la respuesta aceptada.
TiberiusKirk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.