2009-02-11 8 views
5

Ich versuche, eine Datei zu entpacken. Vor dem Untarring möchte ich wissen, wie viel freier Speicherplatz auf dem gemounteten Volume zur Verfügung steht. Der Plan ist, wenn es nicht genug Platz gibt, werde ich es nicht entpacken! Wie kann ich den verfügbaren freien Speicherplatz auf einem bereitgestellten Volume mit Perl finden? Übrigens verwende ich Perl für Teer und Untar.Wie kann ich den verfügbaren freien Speicherplatz auf bereitgestellten Volumes mit Perl finden?

Jeder sagt über df und dh, aber diese Befehle funktionieren nicht auf den Mount-Punkten. Was ist, wenn ich den freien Platz finden möchte, an dem ich in einen gemounteten Punkt schreiben kann?

Antwort

3

Mit Shell-Befehlen eine einzelne K freier Nummer zu erzeugen, die Perl verwenden können:

Wechseln Sie in das Verzeichnis, in dem Sie möchten entpacken (wenn nicht schon da) und ausführen:

df . | grep -v '^Filesystem' | awk 'NF=6{print $4}NF==5{print $3}{}' 

Oder ersetzen Sie "." mit dem tatsächlichen Mount-Punkt.

Der grep entfernt den Header und awk druckt die verfügbaren Kilobyte für Split- und No-Split-Zeilen aus.

Dieses auf der folgenden Art von Ausgang basiert, können Sie einstellen müssen, um, wenn Ihr UNIX gibt etwas anderes:

 
Filesystem 1K-blocks  Used Available Use% Mounted on 
/dev/sda4  206434224 56965356 139065176 30%/
varrun   1037296  132 1037164 1% /var/run 
varlock   1037296   0 1037296 0% /var/lock 
udev   1037296  68 1037228 1% /dev 
devshm   1037296  12 1037284 1% /dev/shm 
/dev/sda2   93327  43535  44973 50% /boot 
/dev/sdc1  155056484 29417456 117824612 20% /media/extra160 
gvfs-fuse-daemon 
       206434224 56965356 139065176 30% /home/pax/.gvfs 
+2

Die Verwendung eines cpan-Moduls ist der richtige Weg. Sie möchten Shell-Aufrufe vermeiden, wenn es nicht notwendig ist ... – Neil

+1

@Neil, wenn Sie die Quelle für Filesys :: DiskFree betrachten, werden Sie feststellen, dass alle * es * df unter den Abdeckungen aufrufen wird. Seine Portabilität scheint sich nicht auf Windows Perl zu erstrecken, was im Allgemeinen der einzige Grund ist, warum ich mich darum kümmern würde, ein CPAN-Modul zu installieren (da die Windows/* IX-Portabilität eher trickreich ist). Da ich normalerweise nur auf Linux oder Linux/Windows abziele (ich kümmere mich normalerweise nicht um Solaris oder BSD), würde ich es lieber selbst machen und die Notwendigkeit vermeiden, ein anderes Modul zu installieren. – paxdiablo

+0

Gibt das die verfügbare Menge in Bytes an? – Ben

13

Wahrscheinlich möchten Sie das CPAN-Modul Filesys::DfPortable.

+0

Funktioniert nicht auf Centos (6.3, zumindest) ... Ich nehme an, es ist, weil auf Centos Root-Dateisystem ist so lange wie "/ dev/mapper/vg_srvctoklos-lv_root", so dass die df-Linie in zwei Teile aufgeteilt ist Linien ... – MarcoS

+1

Dann möchten Sie das CPAN-Modul [Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::DfPortable), die "mit allen Versionen von Windows (95 und höher) und mit funktionieren sollte alle Arten von Unix, die Statvfs oder Statfs-Aufrufe implementieren, darunter Linux, * BSD, HP-UX, AIX, Solaris, Mac OS X, Irix, Cygwin usw. " – geira

+0

@geira Vielen Dank für die Erwähnung der [ Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::DfPortable) Modul. Das ist der endgültige Weg. Es ist bedauerlich, dass dies nicht als die beste (oder vielleicht als eine Alternative) Antwort auf die Frage zu diesem Thema zeigt. Das sollten die Leute, die diese Seite über Websearch finden, sehen. – Keve

1

Sie könnten nur verwenden integrierte in Linux-Befehle, um die Ergebnisse zu erhalten:

my $vol = "/dev/volume"; 
my $freespace = `df $vol | grep '$vol' | awk '{print \$4}'`; 
# free space in megabytes. 
$freespace = sprintf("%01.2f", $freespace/1024); 
+1

Verwenden Sie die Shell nicht, wenn Sie nicht müssen. – Neil

Verwandte Themen