web-dev-qa-db-fra.com

Comment obtenir la taille du dossier ignorer les liens durs?

J'utilise rsnapshot pour les sauvegardes, qui génère une série de dossiers contenant des fichiers du même nom. Certains des fichiers sont liés durs, tandis que d'autres sont séparés. Par exemple, hourly.1/file1 et hourly.2/file1 peut être lié difficile au même fichier, tandis que hourly.1/file2 et hourly.2/file2 sont des fichiers entièrement séparés.

Je veux trouver la quantité d'espace utilisé par le dossier hourly.2ignorer tous les fichiers qui sont des liens difficiles à des fichiers dans hourly.1. Donc, dans l'exemple ci-dessus, je voudrais obtenir la taille de fichier2, mais ignorer le fichier1.

J'utilise Bash sur Linux et je veux le faire à partir de la ligne de commande aussi simple que possible, donc aucune solution graphique ou d'autres systèmes d'exploitation uniquement.

18
Benubird

Taille totale en octets de tous les fichiers de hourly.2 qui n'a qu'un seul lien:

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

De find man-page:

   -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 comptes de lien, jouez avec find -links +1 (plus d'un lien), find -links -5 (moins de cinq liens) et ainsi de suite.

8
grebneke

Comme @gilles dit, puisque du _ Nume que le premier de tous les hardlinks pointant vers la 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. Tout fichier dans 'Hourly.2' Référencer une inode (AKA "Real" Fichier) déjà référencé dans "Hourry.1", ne sera pas compté.

9
tuk0z

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
...

Les constructions de find sont fournies sans -printf Support. Voici une modification à @ Grebneke's Resole :

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