En utilisant rsync --link-dest
des instantanés peu encombrants , comment savoir combien d'espace j'ai réellement économisé? Ou plus général:
Comment savoir combien d'espace un répertoire utilise en considérant uniquement les fichiers qui ne sont pas liés par un lien dur ailleurs en dehors de la structure du répertoire? Question différente: combien d'espace serait réellement libéré après la suppression de ce répertoire? (
du -hs
mentir. L'espace requis pour les liens physiques eux-mêmes peut être inclus)
disk-usage
hard-link
Tobias Kienzler
la source
la source
du
ne compte les tailles de fichier qu'une seule fois, même si elles sont liées de manière fixe, sauf si vous utilisez l' option-l
/--count-links
. Vous exécutezdu
deux fois sur l'arborescence entière, avec et sans cette option et la différence entre les tailles doit être la quantité d'espace que vous avez économisée sur tous les répertoires.Réponses:
En supposant qu'il n'y a pas de liens physiques internes (c'est-à-dire que chaque fichier avec plus d'un lien physique est lié depuis l'extérieur de l'arborescence), vous pouvez faire:
EDIT Et voici ce que j'ai esquissé dans le commentaire, appliqué. Seulement sans
du
; bravo à @StephaneChazelas pour avoir remarqué qu'ildu
n'est pas nécessaire. Explication à la fin.Ce que nous faisons est de créer une chaîne avec l'utilisation du disque (en Ko) de chaque fichier pertinent, séparée par des signes plus. Ensuite, nous alimentons ce gros ajout à
bc
.La première
find
invocation fait cela pour les répertoires.Le second
find
imprime le nombre de liens, l'inode et l'utilisation du disque. Nous passons cette listesort | uniq -c
pour obtenir une liste de (nombre d'apparitions dans l'arborescence, nombre de liens, inode, utilisation du disque).Nous passons cette liste à travers
awk
, et, si le premier champ (# d'apparences) est supérieur ou égal au second (# de liens physiques), ce qui signifie qu'il n'y a pas de liens vers ce fichier depuis l'extérieur de l'arborescence, alors imprimez le quatrième champ ( utilisation du disque) avec un signe plus et une barre oblique inversée.Enfin, nous sortons a
0
, donc la formule est syntaxiquement correcte (elle le ferait dans le+
cas contraire) et la transmettons àbc
. Phew.(Mais j'utiliserais la première méthode la plus simple, si elle donne une bonne réponse.)
la source
find
pour imprimer une liste de tous les fichiers avec leurs inodes et le nombre de liens; puis une combinaison desort | uniq -c
pour obtenir le nombre de fois que chaque inode apparaît dans l'arborescence, puis filtrer ceux dont le nombre de liens est supérieur au nombre d'apparitions ... puis alimenter cette listedu
. Mais si l'exigence est remplie, mieux vaut économiser l'effort.du
avait un-d
paramètre similaire àls
's ...btrfs
systèmes de fichiers, le nombre de liens pour les répertoires est toujours1
, vous devez donc ajouter un! -type d
Fondamentalement, vous devez obtenir les numéros d'inode et le nombre de liens pour tous les fichiers (non-répertoires), comparer ce nombre de liens avec le nombre d'occurrences de chaque inode et, s'ils diffèrent, exclure le fichier.
En supposant qu'ils sont tous sur le même système de fichiers, quelque chose comme ça devrait fonctionner (avec GNU find):
la source
%k
été rapporté. C'est super, cedu
n'est pas nécessaire du tout! Je mettrai à jour ma réponse quand je rentrerai. Merci!du
en réalité, il ne mentira pas;) Il analyse le ou les répertoires qu'on lui donne, en ne comptant que le premier de tous les liens physiques pointant vers le même inode qu'il rencontre.Si vous demandez
du
ce qu'il voit dans un seul répertoire, il ne se soucie pas qu'il existe d'autres liens durs pointant vers le même contenu:Donnez-lui maintenant des répertoires sur la même ligne (en commençant par le plus récent pour les sauvegardes incrémentielles rsync avec
--link-dest
):Ou tout le répertoire de sauvegarde:
Tout fichier dans 'daily.1' référençant un inode (aka "vrai" fichier) déjà référencé dans 'daily.0' ne sera pas compté.
Par conséquent, la suppression quotidienne.1 permettra d'économiser 364 Mo sur votre appareil.
RETIRER
la source