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:
find . -links -2 -print0 | du -c --files0-from=-
EDIT Et voici ce que j'ai esquissé dans le commentaire, appliqué. Seulement sans du
; bravo à @StephaneChazelas pour avoir remarqué qu'il du
n'est pas nécessaire. Explication à la fin.
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
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 liste sort | 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.)
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.