perlでディレクトリ配下のファイル数、合計サイズを出力

もっとスッキリさせたい

#!/usr/bin/perl

my $size = 0;
my $sizek = 0;
my $sizem = 0;
my @du;
my $dusizek = 0;
my $dusizem = 0;
my $count = 0;
my $sec;
my $min;
my $hour;
my $mday;
my $mon;
my $year;

open( IN, "ls -ltr $ARGV[0] |");
@INPUT_ARG = <IN>;
close(IN);

foreach $INPUT_ARG_TMP (@INPUT_ARG) {
	chomp ($INPUT_ARG_TMP);
	@RESULT_LIST = split(/\s+/,$INPUT_ARG_TMP);
	$size += $RESULT_LIST[4];
	$count++;
}

($sec,$min,$hour,$mday,$mon,$year) = (localtime(time))[0..5];
$year += 1900;
$mon += 1;

@du = split(/\s+/,`du -ksS $ARGV[0]`);
$dusizek = @du[0];

print "DATA			: ", "$year-$mon-$mday $hour:$min:$sec\n";
print "PATH			: ", $ARGV[0], "\n";
print "DIR SIZE [ls - KB]	: ", $size = &SIZE_CONV(KB), "\n";
print "DIR SIZE [du - KB]	: ", $dusizek = @du[0], "\n";
print "DIR SIZE [ls - MB]	: ", $size = &SIZE_CONV(MB), "\n";
print "DIR SIZE [du - MB]	: ", $dusizem = @du[0] / 1024, "\n";
print "FILE COUNT		: ", $count, "\n";
print "----------------\n";

sub SIZE_CONV {
	my ($arg) = @_;
	my ($return) = 0;
	
	if ( "KB" eq $arg) {
		$return = ($size / 1024) ;
	} elsif ( "MB" eq $arg ) {
		$return = (($size / 1024) / 1024) ;
	}
	return $return;
}

wafl.maxdir file size

NetAppをnfsでマウントしている領域で「File too large」。
touchでファイル作っても「File too large」。
1ディレクトリ内のファイル数上限を超えた...?
2,221,918以上作れない。

根拠となる仕様や式が見つからないので、前述のtouchでexitコード1が戻るまでループしたらやっぱり2,221,918以上作れない。

見つけました根拠。

参考:http://ompnix.blogspot.jp/2011/09/waflmaxdir-file-size.html


NetApp搭載メモリ:16G

(16777216 * 1%) * 128 / 4 = 5368709.12

cifsも有効となっているのでそれも加味しました。
((16777216 * 1%) * 128 / 4 ) * 41.3%= 2217276.86656

2,221,918 ≒ 2,217,276

精密に計算するともっと近くなると思います。

対話型シェルスクリプトのデフォルト設定

対話型シェルスクリプトを作り、隣の人にレビューしてもらいました。 レビュー前後でこう変わりました。

レビュー前

echo -n "please input targets_arg1 (default = HOGE) : "
read ARG1
if [ -z $ARG1 ]; then
        ARG1=HOGE
fi

レビュー後

echo -n "please input targets_arg1 (default = HOGE) : "
read INPUT_ARG1
ARG1=${INPUT_ARG1:-"HOGE"}


変数が1個増えますがif文が減ります。 保守性など考えなかったら個人的にはレビュー後の形が好きです。

:-


「:」の後ろは幾つかあるので勉強しよう。