Comment obtenir la taille d'un dossier en ignorant les liens durs?

17

J'utilise rsnapshot pour les sauvegardes, ce qui génère une série de dossiers contenant des fichiers du même nom. Certains fichiers sont liés en dur, tandis que d'autres sont séparés. Par exemple, hourly.1/file1et hourly.2/file1peuvent être liés en dur au même fichier, hourly.1/file2et hourly.2/file2sont des fichiers entièrement séparés.

Je veux trouver la quantité d'espace utilisée par le dossier en hourly.2 ignorant tous les fichiers qui sont des liens durs vers des fichiers dans hourly.1. Donc, dans l'exemple ci-dessus, je voudrais obtenir la taille de file2, mais ignorer file1.

J'utilise bash sur linux, et je veux le faire aussi simplement que possible à partir de la ligne de commande, donc pas de grandes solutions graphiques ou autres OS uniquement.

Benubird
la source

Réponses:

7

Taille totale en octets de tous les fichiers dans hourly.2lesquels n'ont qu'un seul lien:

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

De la findpage de manuel:

   -links n
          File has n links.

Pour obtenir la somme en kilo-octets au lieu d'octets, utilisez -printf "%k\n"

Pour répertorier les fichiers avec différents nombres de liens, jouez avec find -links +1(plus d'un lien), find -links -5(moins de cinq liens), etc.

grebneke
la source
1
Si un fichier contient un lien dur vers un fichier hourly2, votre commande procédera à une mauvaise réponse.
cuonglm
@Gnouc - Eh bien oui - cela dépend de la façon dont les fichiers se retrouvent hourly.2. S'ils y sont copiés, ils n'auront pas de liens supplémentaires et ma commande fonctionnera. S'ils sont liés en dur, cela échouera évidemment. Je suppose que les nouveaux fichiers de sauvegarde sont copiés.
grebneke
11

Si vous souhaitez spécifiquement la taille des fichiers présents sous hourly.2mais pas sous hourly.1, vous pouvez l'obtenir un peu indirectement avec du. Si dutraite le même fichier plusieurs fois (même sous des noms différents, c'est-à-dire des liens durs), il ne compte le fichier que la première fois. Donc, ce qui est du hourly.1 hourly.2signalé, hourly.2c'est la taille que vous recherchez. Donc:

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

(Fonctionne sur n'importe quel système POSIX et la plupart des autres variantes Unix. Suppose que le nom du répertoire hourly.1ne contient aucune nouvelle ligne.)

Gilles 'SO- arrête d'être méchant'
la source
Pour une raison étrange, du ne remarque pas toujours les fichiers liés sur RHEL5 - si je fais «du -sh dir / sub dir», la sortie de dir est la même que si je viens de dire «du -sh dir» - sans exclure la taille de «dir / sub».
Andreas Krey
9

Comme le dit @Gilles, puisque dune compte que le premier de tous les liens physiques pointant vers le même inode qu'il rencontre, vous pouvez lui donner des répertoires d'affilée:

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

C'est-à-dire que tout fichier dans 'hourly.2' référençant un inode (aka "vrai" fichier) déjà référencé dans 'hourly.1', ne sera pas compté.

tuk0z
la source
2
Selon du --help , l'option --max-depth = 0 est équivalente à -s , donc ci-dessus peut être raccourci comme:$ du -hcs dirA dirB
akavel
2

Plus simple

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

Exemple

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
...
Abdel Karim Mateos Sanchez
la source
Merci Abdel. Ce devrait être la réponse acceptée.
TiberiusKirk
Impressionnant. Cela a fonctionné pour moi lors du premier essai de mon macOS 10.15. Je vous remercie.
dimitarvp Il y a
1

Les versions impressionnantes de BusyBox sont fournies findsans -printfsupport. Voici la modification de la réponse de @ grebneke :

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