2009-02-11 9 views
5

Sto provando a decomprimere un file. Prima di decodificare vorrei conoscere lo spazio libero disponibile sul volume montato. Il piano è se non c'è abbastanza spazio che non lo spaccherò! Quindi, come posso trovare lo spazio libero disponibile su un volume montato usando Perl? A proposito, sto usando Perl per tar e untar.Come posso trovare lo spazio libero disponibile sui volumi montati usando Perl?

Tutti parlano di df e dh ma questi comandi non funzionano sui punti di montaggio. Cosa succede se voglio trovare lo spazio libero su cui posso scrivere su un punto montato?

risposta

3

Utilizzando comandi di shell per generare un unico numero verde K che Perl può utilizzare:

Modifica nella directory in cui si desidera decomprimere (se non già presente) ed eseguire:

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

Oppure sostituire "." con il punto di montaggio effettivo.

Il grep elimina l'intestazione e l'awk stampa i kilobyte disponibili sia per le linee split che per quelle non suddivise.

Questo si basa sulla seguente tipo di uscita, potrebbe essere necessario modificare se il vostro UNIX uscite qualcosa di diverso:

 
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

Utilizzare un modulo cpan per farlo è il modo corretto. Vuoi evitare le chiamate "shell" quando non è necessario ... – Neil

+1

@Neil, se guardi all'origine di Filesys :: DiskFree, scoprirai che tutto * fa * è chiamare df sotto le copertine. La sua portabilità non sembra estendersi a Windows Perl, che è generalmente l'unica ragione per cui mi preoccuperei di installare un modulo CPAN (dato che la portabilità di Windows/* IX tende a essere complicata). Dato che tendo solo a scegliere Linux o Linux/Windows (di solito non mi interessa Solaris o BSD), preferirei farlo da solo ed evitare la necessità di installare un altro modulo. – paxdiablo

+0

Fornisce la quantità disponibile in byte? – Ben

13

Probabilmente si desidera il modulo CPAN Filesys::DfPortable.

+0

Non funziona su Centos (6.3, almeno) ... Suppongo che sia perché su Centos il filesystem di root è qualcosa di simile a "/ dev/mapper/vg_srvctoklos-lv_root", quindi la linea df è divisa in due righe ... – MarcoS

+1

Quindi si desidera il modulo CPAN [Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::Fascile) che "dovrebbe funzionare con tutte le versioni di Windows (95 e successive) e con tutte le versioni di Unix che implementano le chiamate statvfs o statfs. Ciò include Linux, * BSD, HP-UX, AIX, Solaris, Mac OS X, Irix, Cygwin, ecc ... " – geira

+0

@geira Grazie per aver menzionato [ Modulo Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::DfPortable). Questa è la strada definitiva da percorrere. E 'un peccato che questo non sia la migliore (o forse alternativa) risposta per la domanda di questo argomento. Questo è ciò che le persone che trovano questa pagina tramite websearch dovrebbero vedere. – Keve

1

Si potrebbe utilizzare built-in comandi Linux per ottenere il risultato:

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

Non usare la shell quando non è necessario. – Neil

Problemi correlati