Wie bekomme ich die Ordnergröße, wenn ich harte Links ignoriere?


16

Ich benutze rsnapshot für Backups, die eine Reihe von Ordnern mit gleichnamigen Dateien erzeugen. Einige der Dateien sind fest miteinander verbunden, während andere getrennt sind. Beispielsweise hourly.1/file1und hourly.2/file1möglicherweise fest mit derselben Datei verknüpft, während hourly.1/file2und hourly.2/file2vollständig separate Dateien sind.

Ich möchte den vom Ordner hourly.2 belegten Speicherplatz ermitteln, indem ich alle Dateien ignoriere , die feste Links zu Dateien in sind hourly.1. Im obigen Beispiel möchte ich also die Größe von Datei2 erhalten, aber Datei1 ignorieren.

Ich verwende bash unter Linux und möchte dies so einfach wie möglich über die Befehlszeile tun. Bitte keine großen grafischen oder nur für Betriebssysteme geeigneten Lösungen.

Antworten:


7

Gesamtgröße aller Dateien in Byte, in hourly.2denen nur ein Link vorhanden ist:

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

Aus findder Manpage:

   -links n
          File has n links.

Verwenden Sie, um die Summe in Kilobyte anstelle von Bytes zu erhalten -printf "%k\n"

Spielen Sie mit find -links +1(mehr als einem Link), find -links -5(weniger als fünf Links) usw. , um Dateien mit unterschiedlicher Linkanzahl aufzulisten .


1
Wenn eine Datei einen festen Link zu einer Datei enthält hourly2, wird Ihr Befehl eine falsche Antwort ausführen.
Dienstag,

@ Gnouc - Nun ja - es hängt davon ab, wie die Dateien landen hourly.2. Wenn sie dort kopiert werden, haben sie keine zusätzlichen Links und mein Befehl funktioniert. Wenn sie fest miteinander verbunden sind, wird es offensichtlich scheitern. Ich gehe davon aus, dass neue Backup-Dateien kopiert werden.
Grebneke

11

Wenn Sie speziell die Größe der Dateien, die unter, hourly.2aber nicht unter vorhanden sind hourly.1, möchten , können Sie es ein wenig indirekt mit erhalten du. Wenn dudieselbe Datei mehr als einmal verarbeitet wird (auch unter verschiedenen Namen, dh festen Verknüpfungen), wird die Datei nur beim ersten Mal gezählt. Also, worauf es du hourly.1 hourly.2ankommt, hourly.2ist die Größe, nach der Sie suchen. Somit:

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

(Funktioniert auf jedem POSIX-System und den meisten anderen Unix-Varianten. Vorausgesetzt, der Verzeichnisname hourly.1enthält keine Zeilenumbrüche.)


Aus irgendeinem seltsamen Grund bemerkt du nicht immer fest verknüpfte Dateien auf RHEL5 - wenn ich 'du -sh dir / sub dir' mache, ist die Ausgabe für dir dieselbe, als ob ich nur 'du -sh dir' gesagt hätte - ohne die Größe von 'dir / sub'.
Andreas Krey

8

Wie @Gilles sagt, dukönnen Sie ihm Verzeichnisse in einer Reihe geben , da nur die ersten Hardlinks gezählt werden, die auf denselben Inode verweisen, auf den er stößt:

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

Dh jede Datei in 'hourly.2', die auf eine Inode verweist (auch als "echte" Datei bezeichnet), auf die bereits in 'hourly.1' verwiesen wird, wird nicht gezählt.


2
Laut du --help ist die Option --max-depth = 0 gleichbedeutend mit -s und kann daher wie $ du -hcs dirA dirB
folgt

1

Die Builds von BusyBox werden findohne -printfUnterstützung ausgeliefert. Hier ist eine Änderung der Antwort von @ grebneke :

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

1

Einfacher

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

Beispiel

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

Danke Abdel. Dies sollte die akzeptierte Antwort sein.
TiberiusKirk vor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.