2009-02-11 13 views
5

Estoy tratando de descomprimir un archivo. Antes de quitar el marcador, me gustaría saber si hay espacio libre disponible en el volumen montado. ¡El plan es que si no hay suficiente espacio no lo desataré! Entonces, ¿cómo puedo encontrar el espacio libre disponible en un volumen montado usando Perl? Por cierto, estoy usando Perl para tar y untar.¿Cómo puedo encontrar el espacio libre disponible en volúmenes montados usando Perl?

Todo el mundo está diciendo acerca de df y dh pero estos comandos no funcionan en los puntos de montaje. ¿Qué sucede si quiero encontrar el espacio libre en el que puedo escribir en un punto montado?

Respuesta

3

El uso de comandos de shell para generar un solo número gratuito K, que Perl puede utilizar:

Cambio en el directorio donde desea deshacer (si no está ya allí) y ejecutar:

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

O reemplace "." con el punto de montaje real.

grep elimina el encabezado y el awk imprime los kilobytes disponibles para líneas divididas y no divididas.

Esto se basa en el siguiente tipo de salida, es posible que tenga que ajustar si su UNIX da salida a algo diferente:

 
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

Usar un módulo de cpan para hacerlo es la forma correcta. Desea evitar llamadas al shell cuando no es necesario ... – Neil

+1

@Neil, si mira la fuente de Filesys :: DiskFree, encontrará que todo * it * does es call df under the covers. Su portabilidad no parece extenderse a Windows Perl, que generalmente es la única razón por la que me molestaría en instalar un módulo CPAN (ya que la portabilidad de Windows/* IX tiende a ser complicada). Dado que solo tengo como destino Linux o Linux/Windows (normalmente no me preocupo por Solaris o BSD), preferiría hacerlo yo mismo y evitar la necesidad de instalar otro módulo. – paxdiablo

+0

¿Esto da la cantidad disponible en bytes? – Ben

13

Es probable que desee el módulo CPAN Filesys::DfPortable.

+0

No funciona en Centos (6.3, al menos) ... Supongo que es porque en el sistema de archivos raíz de Centos es algo tan largo como "/ dev/mapper/vg_srvctoklos-lv_root", por lo que la línea df se divide en dos líneas ... – MarcoS

+1

Luego desea el módulo CPAN [Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::DfPortable) que "debería funcionar con todas las versiones de Windows (95 y más), y con todos los sabores de Unix que implementan las llamadas statvfs o statfs. Esto incluiría Linux, * BSD, HP-UX, AIX, Solaris, Mac OS X, Irix, Cygwin, etc ... " – geira

+0

@geira Gracias por mencionar el [ Módulo Filesys :: DfPortable] (https://metacpan.org/pod/Filesys::DfPortable). Esa es la manera definitiva de ir. Es desafortunado que esto no se muestre como la mejor (o tal vez como alternativa) respuesta para la pregunta sobre este tema. Esto es lo que deberían ver las personas que encuentran esta página a través de la búsqueda web. – Keve

1

Se podía utilizar una función de comandos de Linux para obtener el resultado:

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

No use el armazón cuando no sea necesario. – Neil

Cuestiones relacionadas