Usando rsync --link-dest
para capturas instantâneas de economia de espaço , como posso descobrir quanto espaço realmente economizei? Ou mais geral:
Como descobrir quanto espaço um diretório usa, considerando apenas arquivos que não estão vinculados em outro local fora da estrutura de diretórios? Perguntado de forma diferente: quanto espaço seria realmente liberado após a exclusão desse diretório? (
du -hs
mentiria. O espaço necessário para os próprios hardlinks pode ser incluído)
disk-usage
hard-link
Tobias Kienzler
fonte
fonte
du
conta apenas os tamanhos de arquivo uma vez, mesmo se eles estiverem vinculados, a menos que você use a opção-l
/--count-links
. Você executadu
a árvore inteira duas vezes, com e sem essa opção e a diferença entre os tamanhos deve ser a quantidade de espaço que você salvou em todos os diretórios.Respostas:
Supondo que não haja links físicos internos (ou seja, todo arquivo com mais de um link físico esteja vinculado de fora da árvore), você pode:
EDIT E aqui está o que eu esboçado no comentário, aplicado. Somente sem
du
; parabéns a @StephaneChazelas para perceber quedu
não é necessário. Explicação no final.O que fazemos é criar uma string com o uso do disco (em KB) de cada arquivo relevante, separado por sinais de adição. Então alimentamos essa grande adição a
bc
.A primeira
find
chamada faz isso para diretórios.A segunda
find
imprime a contagem de links, o inode e o uso do disco. Passamos essa listasort | uniq -c
para obter uma lista de (número de aparências na árvore, contagem de links, inode, uso do disco).Passamos essa lista
awk
e, se o primeiro campo (número de aparências) for maior ou igual ao segundo (número de hardlinks), o que significa que não há links para esse arquivo de fora da árvore e imprima o quarto campo ( uso de disco) com um sinal de adição e uma barra invertida anexada.Finalmente, produzimos a
0
, portanto a fórmula está sintaticamente correta (seria en+
caso contrário) e a passamos parabc
. Ufa.(Mas eu usaria o primeiro método mais simples, se ele der uma resposta boa o suficiente.)
fonte
find
para imprimir uma lista de todos os arquivos com seus inodes e contagem de links; então, uma combinação desort | uniq -c
para obter quantas vezes cada inode aparece na árvore, filtrar aqueles com contagem de links maior que o número de aparências ... e depois alimentar essa listadu
. Mas se o requisito for atendido, salve o esforço.du
tivesse um-d
parâmetro parecido comls
o da ...btrfs
sistemas de arquivos, o número de links para diretórios é sempre1
, portanto, você deve adicionar um! -type d
Basicamente, você precisa obter os números de inode e o número de links para todos os arquivos (não diretórios), comparar esse número de link com o número de ocorrência de cada inode e, se eles diferirem, excluir o arquivo.
Supondo que todos estejam no mesmo sistema de arquivos, algo como isto deve funcionar (com o GNU find):
fonte
%k
relatado. Isso é ótimo,du
não é necessário! Vou atualizar minha resposta quando chegar em casa. Obrigado!du
na verdade não mentirá;) Analisa o (s) diretório (s) fornecido (s), contando apenas o primeiro de todos os hardlinks apontando para o mesmo inode encontrado.Se você perguntar
du
o que vê apenas em um diretório, não importa se existem outros links físicos apontando para o mesmo conteúdo:Agora forneça diretórios na mesma linha (começando pelo mais recente para backups incrementais do rsync com
--link-dest
):Ou todo o diretório de backup:
Qualquer arquivo em 'daily.1' referenciando um inode (também conhecido como arquivo "real") já mencionado em 'daily.0' não será contado.
Portanto, excluir daily.1 economizará 364 MB no seu dispositivo.
RETIRAR
fonte