【发布时间】:2010-09-22 19:44:43
【问题描述】:
根据 cmets 更新:
我有 outlog.txt 文件,其中包含多个文件名,例如:2345_535_Dell&HP_3PAR_DEAL.txt,同样有许多文件名,但不是文件所在的实际文件夹,因此在代码中将文件名附加到文件夹路径以获取实际文件位置。现在,我想获取outlog.txt 中所有文件的磁盘使用情况以及outlog.txt 中所有文件的总磁盘使用情况。
我尝试了两种方法 perl -s 和 my ($size) = split(' ', du `"$folderpath/$_"`) 但两种方法都给了我不同的值,而且当我使用 @987654327 时@ 比我得到一些数值,但它没有给我单位,有没有一种方法可以让我在不使用 -h 选项的情况下获得人类可读性,因为它在我的系统上不起作用?
背景信息
我的目标是获取文件的大小,目前我正在使用perl -s 来获取文件大小。我也尝试过du,并且得到了同一文件大小的不同值。我无法理解这是如何工作的。
问:为什么du 和perl -s 给出不同的大小值?它们在内部是如何工作的?这两个不同的值中哪一个更准确?另外,我不知道为什么du -h filename 给我一个非法表达式错误:
bash-2.03$ du -h test.txt
/usr/bin/du: illegal option -- h
usage: du [-a][-d][-k][-r][-o|-s][-L] [file ...]
代码:
my $folderpath = 'the_path';
open my $IN, '<', 'path/to/infile';
my $total;
while (<$IN>) {
chomp;
my $size = -s "$folderpath/$_";
print "$_ => $size\n";
$total += $size;
}
print "Total => $total\n";
礼貌:RickF
更新:
问:
如何获取每个文件的磁盘使用值而不是文件大小,这意味着如何获取每个文件的 du 值而不是 perl -s 文件的值?
操作系统信息 名称:SunOS uname -v :Generic_117350-39
更新代码:根据大脑的方法,但 du 值仍然打印为零而不是实际值,有什么建议吗?
更新:
如果我使用我的 ($size) = split(' ', du "$folderpath/$_");比我得到 du 的价值,但它给了我一些数字,我怎样才能在不使用 -h 选项的情况下将它变成人类可读的?
#!/usr/bin/perl
use strict;
use warnings;
my $folderpath = '/Project/upload';
open my $IN, '<', 'outlog.txt';
my $total;
while (<$IN>) {
chomp;
#my( $block_size, $blocks ) = ( stat( "$_" ) )[11,12];
#my $du_size = $block_size * $blocks;
my ($size) = split(' ', `du "$folderpath/$_");
#my $size = -s "$folderpath/$_";
print "$_ => $size\n";
$total += $size;
}
print "Total => $total\n";
【问题讨论】:
标签: perl file unix storage command