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文が減ります。 保守性など考えなかったら個人的にはレビュー後の形が好きです。
:-
「:」の後ろは幾つかあるので勉強しよう。
参考