はじめての親子ハイキングに挑戦!! >>

指定ディスクの空きディスクの容量を求める処理として、
Windowsでは、Win32::OLE を使って求められることをこちらで教えて頂きました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1780512

同様なことをLinuxで実施するにはどうすれば良いでしょうか。
単純には、Linuxでは、dfコマンドなどを``バッククォートで実行して処理すれば良さそうですが、
できれば、Windows/Linux で共通のスクリプトとして書けたらと思っています。

方法があれば、教えてください。よろしくお願いします。

A 回答 (4件)

CPAN の Filesys::DfPortable は、御希望そのものでは?



参考URL:http://search.cpan.org/~iguthrie/Filesys-DfPorta …

この回答への補足

あ、これです!
ご紹介、ありがとうございます。

ということで、素人ながらインストールに挑戦・・・
⇒Linuxは・・・見よう見まねで・・・成功した?感じです(下記)

[/usr/local/src/Filesys] tar xvfz Filesys-DfPortable-0.85.tar.gz
[/usr/local/src/Filesys] cd Filesys-DfPortable-0.85
[/usr/local/src/Filesys/Filesys-DfPortable-0.85] perl Makefile.PL
OS = linux
Checking for statvfs .....

Checking if your kit is complete...
Looks good
Writing Makefile for Filesys::DfPortable
[/usr/local/src/Filesys/Filesys-DfPortable-0.85] make
cp DfPortable.pm blib/lib/Filesys/DfPortable.pm
/usr/bin/perl /usr/lib/perl5/5.8.0/ExtUtils/xsubpp -prototypes -typemap /usr/lib/perl5/5.8.0/ExtUtils/typemap -typemap typemap DfPortable.xs > DfPortable.xsc && mv DfPortable.xsc DfPortable.c

chmod 644 blib/arch/auto/Filesys/DfPortable/DfPortable.bs
Manifying blib/man3/Filesys::DfPortable.3pm
[/usr/local/src/Filesys/Filesys-DfPortable-0.85] make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl
1..2
ok 1
ok 2
Results for directory: "/" in bytes:
Total: 10565488640
Free: 9253040128
Available: 8716341248
Used: 1312448512
Percent Full: 13
All tests successful!
[/usr/local/src/Filesys/Filesys-DfPortable-0.85] make install

Appending installation info to /usr/lib/perl5/5.8.0/i386-linux-thread-multi/perllocal.pod

⇒Windowsは・・・
ーっと、どうやってインストールすれば良いでしょう?
まさか*.pmファイルをC:\Perl\libにコピーすればOKとか。。。やってみたけどダメでした。 (;.;

補足日時:2006/06/27 18:29
    • good
    • 0
この回答へのお礼

ご紹介ありがとうございました。
上記、補足しましたが、Windows環境(2000+ActivePerl v5.8.7です)
へのインストールはどうやって行えば良いでしょうか?

Linuxと同じようにやってみましたが、出来ませんでした。

C:\Perl\work\tar\Filesys-DfPortable-0.85>perl Makefile.PL
OS = MSWin32
Building for Windows ....
Checking if your kit is complete...
Looks good
Writing Makefile for Filesys::DfPortable

C:\Perl\work\tar\Filesys-DfPortable-0.85>make
Makefile:339: *** multiple target patterns. Stop.

→このMakeは、Cygwinのもののようです。

ちょっと質問の方向が逸れてしまいますが、よろしくご教示ください。

お礼日時:2006/06/27 18:34

Linux でも、次のようにして install するのがお薦めです。


%perl -MCPAN -e shell
>install Filesys::DfPortable

初回なら、まず
>install Bundle::CPAN

をして下さい。尚、/usr/local/lib/perl5/... に書き込み権が要るので、必要ならば sudo するとか。
    • good
    • 0
この回答へのお礼

!思わず、おお!と言ってしまいました。
何度もありがとうございました。

>>必要ならば sudo するとか。
rootユーザで入ってオペしても同じことですよね。

何れにしましても、私自身、目に見えない感覚ですが、Levelがupした実感があります。今日は良い日でした。(^^
ありがとうございました。

お礼日時:2006/06/27 19:21

#1>##dfコマンドなどを``バッククォートで実行して処理ということになるでしょうか。


それでいいんじゃないでしょうか・というところで、、
#2で、紹介されているDfPortable いいですね♪
やっぱ、すでにあるならそれを使うのがいいんじゃないでしょうか。
やはり、作る前に探せ(大抵は誰かが作っているから)ってことですね。^^
とりあえず、インストールしてみました
Windows の場合、DLLを呼び出すみたいですね。

この回答への補足

>>とりあえず、インストールしてみました

インストールの方法が・・・・(;.;

補足日時:2006/06/27 18:55
    • good
    • 0
この回答へのお礼

インストール分かりました!!(教えてもらいました)

C:\Perl\work\Filesys-DfPortable-0.85>ppm
PPM - Programmer's Package Manager version 3.2.
Copyright (c) 2001 ActiveState Corp. All Rights Reserved.
ActiveState is a division of Sophos.

Entering interactive shell. Using Term::ReadLine::Perl as readline library.

Type 'help' to get started.

ppm> install Filesys::DfPortable
====================
Install 'Filesys-DfPortable' version 0.84 in ActivePerl 5.8.7.813.
====================
Downloaded 622 bytes.
Downloaded 2549 bytes.
Downloaded 3997 bytes.
Downloaded 5457 bytes.
Downloaded 7296 bytes.
Extracting 9/9: blib/arch/auto/Filesys/DfPortable/DfPortable.lib
Installing C:\Perl\site\lib\auto\Filesys\DfPortable\DfPortable.bs
Installing C:\Perl\site\lib\auto\Filesys\DfPortable\DfPortable.dll
Installing C:\Perl\site\lib\auto\Filesys\DfPortable\DfPortable.exp
Installing C:\Perl\site\lib\auto\Filesys\DfPortable\DfPortable.lib
Installing C:\Perl\html\site\lib\Filesys\DfPortable.html
Files found in blib\arch: installing files in blib\lib into architecture dependent library tree
Installing C:\Perl\site\lib\Filesys\DfPortable.pm
Successfully installed Filesys-DfPortable version 0.84 in ActivePerl 5.8.7.813.
ppm> q

C:\Perl\work\Filesys-DfPortable-0.85>test.pl
C:\>test.pl
Total bytes: 39958409728
Total bytes free: 12213548544
Total bytes avail to me: 12213548544
Total bytes used: 27744861184
Percent full: 69


#2さんも見てるかなぁ・・・

まとめてで大変失礼しますが、ご教示色々とありがとうございました。助かりました。

お礼日時:2006/06/27 19:01

UNIX では、ドライブという概念自体ありませんし、


そのような同じスクリプトは使えないと考えていいと思います。
ですが、
$^O で使用しているOSの名称が得られるので、
OSを判別して内部的に別々の処理を(それぞれのOSに応じたパッケージを呼び出す)するようにし、
表面的には同じ結果を返すというようにすれば良いかと思います。

この回答への補足

BLUEPIXYさん、いつもありがとうございます。

>> $^O で使用しているOSの名称が得られるので、

この仕組みを使って、処理を振り分けることを考えたいと思いますが、

実際に「ディスク容量を求める」という部分については、

##dfコマンドなどを``バッククォートで実行して処理

ということになるでしょうか。

補足、よろしくお願いします。

補足日時:2006/06/27 16:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

Qサブルーチンを認識しません。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプトの最後にまとめてあります。
同じサブルーチンは、他のスクリプトでも利用していますが、
エラーは出ていないのですが。

何が原因か、わかりません。
関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。
他のサブルーチンも認識しません。
KCacthの表示は同じ
&main::サブルーチン名 called になっています。
よろしくお願いします。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプト...続きを読む

Aベストアンサー

下記前提でよいでしょうか。
&lock(); ・・・(lockを呼び出している箇所)

sub lock    ・・・サブルーチン:lockの定義
{
・・・
}
上記は1つのソースファイル上にある。

とすると、考えられるのは、
1.undef (&lock); により未定義にしている。
2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様)
です。上記の2点はOKでしょうか?

Q複数ファイルの読み込みについて

perl初心者です。

あるディレクトリから拡張子がdataであるファイルを全て読み込みたいのですが、方法がわかりません。
cshで書くと
foreach arg (*.data)
コマンド $arg

のようになりますが、perlだと
foreach $arg (@arg){
コマンド $arg

となりますよね?
引数がリストなのでよくわかりません。
そもそもperlではできないのでしょうか?


それともう一点ですが、ファイルオープンするときに
foreachループの中で
open(FILE, "$arg");
とすることは可能ですか?
上の質問と組み合わせて全てのファイルを開いて作業を行いたいので。

説明が下手ですいません。補足しますのでよろしくお願いします。

Aベストアンサー

while(<*.data>)
{
## $_には、*.DATAなファイル名が格納されている。
open(F,"$_"); ##openする。
while(<F>)
{
##読み出された内容が$_に格納されている。
print $_; ##出力してみる。
}
}

というのが最短コーディングです。

Qディレクトリ名を取得したい

perlでディレクトリ名だけを取得したいのですが、
なかなかうまい方法が見つかりません。
ファイル名を取得する・・・というのは結構あるのですが、
ディレクトリ名だけ、というのがどうもわかりません。

ちなみにファイル名取得は以下のようにやっています。
my $md;
opendir(DIR, 'q');
while (defined($dir = readdir(DIR))) {
$md=substr($dir,0,6);
}
closedir(DIR);

ディレクトリ名だけを取得・・・というのはどうやればよいのでしょうか。

Aベストアンサー

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){ next;}
#ファイルの場合
if( -f $check_dir.$temp ){
push @file, $temp;
}
#ディレクトリの場合
if( -d $check_dir.$temp ){
push @directory, $temp;
}
}

$check_dirに設定されているディレクトリに格納されているファイルは@fileに、ディレクトリは@directoryに格納されます。

ファイル名の取得で例示されているものは、ファイル名だけの取得できてませんよね?
質問者さんが書かれているスクリプトだと、
DIRの中にある「何か」の「たまたま」一番最後に入っていたものの「0文字目~6文字目」までを取得するスクリプトになっているのわかりますか?

my @file;
my @directory;
my $check_dir = "./q/";
$ct =0;
opendir(DIR,$check_dir);
while( defined($temp=readdir(DIR))){
#カレントディレクトリまたは上位ディレクトリの場合はパス
if( $temp eq '.' || $temp eq '..' ){...続きを読む

Qコマンド終了ステータス

rsyncの終了ステータスによってその後の処理を切り替えています.

<src>
rsync -auz --delete $SDIR $DDIR

if [ $? -eq 0 ]; then

 END=`date '+%Y-%m-%d-%H-%M-%S'`
 echo "$END $1 end" >> /home/hoge/log
else

 echo "ERROR! exit status $?" >> /home/hoge/log
fi
</src>

rsyncが正常終了すればlogファイルに時間を記入して,
正常終了しなかったら,終了ステータスを記入します.

もし,rsyncが正常終了したにも関わらず,ちょうどif [ $? -eq 0 ]; thenに入るまえに
他のコマンドが異常終了したら変数$?の値が変わると思います.

かなり気にしすぎかもしれませんが,rsyncだけの終了ステータスに注目するにはどうしたらいいでしょうか?

よろしくお願いします.

Aベストアンサー

>crontabでシェルを動かしているときにkillをしてもkillコマンドの終了ステータスは入ることなくrsyncの終了ステータスをちゃんと受け取れるという理解でよろしいでしょうか?

まず他の方が書いているように、$? はそのシェルプロセスのローカル変数なので、別のプロセス(上記だと、killコマンドを投入した対話型シェルのプロセス)の影響を受けることはありません。

rsync が実行途中でkillされた場合、rsyncの終了ステータス $? は、128+(killのシグナル番号) になります。killのシグナル番号はデフォルトだと15なので、143 ですね。kill -9 とかすると、137 になります。

正確には、「rsyncは15番のシグナルでkillされた」ということがrsyncを呼び出したシェルプロセス(bashとかshとか)に返るので、シェルが+128して、$? にセットして通常の終了(プログラムが自分で狩猟ステータスを指定して終了した)場合と区別できるようにしてます。
あと、126と127もシェルによって予約されたステータスです。
つまり、
・ ?$ が 0~125 → プログラムが終了コードを指定して終了した(Cだとexit(cc);とか return cc;とか)
・ ?$ が 126 → コマンドが存在するが実行に失敗した(実行権限なしなど)
・ ?$ が 127 → コマンドが存在しない(command not found)
・ ?$ が 128 → このケースはたぶん無いはず
・ ?$ が 129~ → コマンドが実行中にシグナル番号($?-128)でkillされた

>crontabでシェルを動かしているときにkillをしてもkillコマンドの終了ステータスは入ることなくrsyncの終了ステータスをちゃんと受け取れるという理解でよろしいでしょうか?

まず他の方が書いているように、$? はそのシェルプロセスのローカル変数なので、別のプロセス(上記だと、killコマンドを投入した対話型シェルのプロセス)の影響を受けることはありません。

rsync が実行途中でkillされた場合、rsyncの終了ステータス $? は、128+(killのシグナル番号) になります。killのシグナル番号はデフォルトだ...続きを読む


人気Q&Aランキング