Utilizando las rsync --link-dest
instantáneas que ahorran espacio , ¿cómo puedo calcular cuánto espacio ahorré realmente? O más general:
¿Cómo calcular cuánto espacio utiliza un directorio considerando solo los archivos que no están enlazados en otro lugar fuera de la estructura del directorio? Preguntado de manera diferente: ¿Cuánto espacio se liberaría realmente después de eliminar ese directorio? (
du -hs
mentiría. Se puede incluir el espacio requerido para los enlaces rígidos)
disk-usage
hard-link
Tobias Kienzler
fuente
fuente
du
solo cuenta los tamaños de archivo una vez, incluso si están vinculados, a menos que use la opción-l
/--count-links
. Se ejecutadu
en todo el árbol dos veces, con y sin esa opción y la diferencia entre los tamaños debería ser cuánto espacio ha guardado en todos los directorios.Respuestas:
Suponiendo que no hay enlaces internos (es decir, cada archivo con más de 1 enlace está vinculado desde fuera del árbol), puede hacer lo siguiente:
EDITAR Y aquí está lo que bosquejé en el comentario, aplicado. Solo sin
du
; Felicitaciones a @StephaneChazelas por notardu
que no es necesario. Explicación al final.Lo que hacemos es crear una cadena con el uso del disco (en KB) de cada archivo relevante, separados por signos más. Luego alimentamos esa gran adición a
bc
.La primera
find
invocación hace eso para los directorios.El segundo
find
imprime recuento de enlaces, inodo y uso de disco. Pasamos esa listasort | uniq -c
para obtener una lista de (número de apariciones en el árbol, recuento de enlaces, inodo, uso del disco).Pasamos esa lista
awk
y, si el primer campo (# de apariencias) es mayor o igual que el segundo (# de enlaces duros), lo que significa que no hay enlaces a este archivo desde fuera del árbol, imprima el cuarto campo ( uso del disco) con un signo más y una barra invertida adjunta.Finalmente, sacamos a
0
, por lo que la fórmula es sintácticamente correcta (de lo+
contrario sería en ) y se la pasa abc
. Uf.(Pero usaría el primer método más simple, si da una respuesta lo suficientemente buena).
fuente
find
para imprimir una lista de todos los archivos con sus inodos y conteo de enlaces; luego alguna combinación desort | uniq -c
para obtener cuántas veces cada inodo aparece en el árbol, luego filtrar aquellos con un recuento de enlaces mayor que el número de apariciones ... y luego alimentar esa listadu
. Pero si se cumple el requisito, mejor ahorre el esfuerzo.du
tuviera un-d
parámetro similar als
's ...btrfs
sistemas de archivos, el número de enlaces para directorios es siempre1
, por lo que deberá agregar un! -type d
Básicamente, necesita obtener los números de inodo y el número de enlaces para todos los archivos (no directorios), comparar ese número de enlace con el número de ocurrencia de cada inodo y, si difieren, excluir el archivo.
Suponiendo que todos están en el mismo sistema de archivos, algo como esto debería funcionar (con GNU find):
fuente
%k
informó. ¡Eso es genial,du
no es necesario en absoluto! Actualizaré mi respuesta cuando llegue a casa. ¡Gracias!du
en realidad no mentirá;) Analiza los directorios que se le dan, contando solo el primero de todos los enlaces duros que apuntan al mismo inodo que encuentra.Si pregunta
du
qué ve solo en un directorio, no le importa que haya otros enlaces duros que apunten a los mismos contenidos:Ahora dele directorios en la misma fila (comenzando con el más reciente para copias de seguridad incrementales de rsync con
--link-dest
):O todo el directorio de respaldo:
No se contará ningún archivo en 'daily.1' que haga referencia a un inodo (también conocido como archivo "real") ya mencionado en 'daily.0'.
Por lo tanto, eliminar diariamente.1 ahorrará 364MB en su dispositivo.
ELIMINAR
fuente