Как определить фактический размер файла на диске с помощью Perl? - PullRequest
0 голосов
/ 19 июля 2010

Я сканирую файловую систему и хочу определить выделенный размер файла на диске.

Используя stat () Я могу получить размер файла как ( stat(_) )[7] , выделенные на диске блоки можно получить из ( stat(_) )[12], а "предпочтительный размер блока для файловой системы ввода-вывода" ( stat(_) )[11].

Однако, если я просто умножу статистические столбцы 11 и 12, я не получу то, что кажется выделенным пространством на диске (в Solaris 5.10 sparc).

Как программно получить пространство, выделенное на диске для файла, из вызова функции stat () в Perl?

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Значение, представленное в (stat _)[11], равно st_blksize, что задокументировано как

Подсказка относительно «наилучшего» размера блока для операций ввода-вывода.Это поле не определено для блочных специальных или символьных специальных файлов.

Это необязательно размер блока конкретной файловой системы, в которой находится ваш файл, но эта же страница руководства содержит удобное определение:

 blkcnt_t st_blocks;   /* Number of 512 byte blocks allocated*/

Таким образом, вы можете использовать такой код, как

#! /usr/bin/perl

use warnings;
use strict;

sub usage { "Usage: $0 file ..\n" }

die usage unless @ARGV;

foreach my $file (@ARGV) {
  my $dir = dirname $file;

  my $blocks = (stat $file)[12];
  unless (defined $blocks) {
    warn "$0: stat $file: $!\n";
    next;
  }

  print "$file - ", $blocks * 512, "\n";
}

Если вы обеспокоены тем, что размеры блоков ваших файловых систем не кратны 512, удвойте-проверьте с помощью

df -g <directory>

или если у вас есть root

fstyp -v /dev/dsk/...

Для обычного файла, размер самого файла, т.е. , (stat _)[7], обычно меньше, чем общий размер всех выделенных блоков, поскольку файловые системы выделяют целые блоки.

2 голосов
/ 19 июля 2010

Это в файловой системе ZFS? Я не уверен, как он будет взаимодействовать с вызовом функции статистики Perl, но обычно существует несоответствие между фактическим размером файла и тем, что сообщается на диске в ZFS, и варьируется в зависимости от метаданных и сжатия. Согласно документации в perldoc -f stat я не вижу, чтобы из stat Perl можно было извлечь достаточно информации, чтобы предсказать, что на самом деле находится на диске в уникальном случае ZFS. Если ничего не помогает, и вам необходимо точно знать, что на самом деле находится на диске, в качестве уродливой последней возможности вы можете просто раскошелиться на du.

См. Здесь.

...