差分FTPを考える(2

まずは以前作ったディレクトリFTPのPerlスクリプトです。

 

#!/usr/local/bin/perl

#use strict;
use Net::FTP;


# 引数を読み取る
if ($#ARGV ne 4 ){
    print "引数が誤っています。\n";
    print "$0 [hostname] [user] [password] [fromdir] [todir]\n";
    exit 1;
}

my $hostname=$ARGV[0];
my $user    =$ARGV[1];
my $password=$ARGV[2];
my $from    =$ARGV[3];
my $to      =$ARGV[4];

my $from_dir =`dirname $from`;
my $from_base=`basename $from`;

my $ret;

chomp $from_base;
chomp $from_dir;

my $ret=chdir("$from");
system("pwd");

# 接続
my $ftp= Net::FTP->new(qq($hostname), Debug => 0);
   $ftp->login($user , $password );
   $ftp->binary();
   $ret=$ftp->cwd($to );
   if($ret eq ''){
     print qq(cwd error \[$to\]\n);
     exit 1;
   }
print qq($ret : $from\n);

# ディレクトリをfindで検索してput先にmkdirする。
print qq(/usr/bin/find . -type d\n);
open (DIRNAME,qq(/usr/bin/find . -type d|));
while (){
  chomp;
  print qq($_\n) unless($_ eq '.');
  $ftp->mkdir($_);
}
close DIRNAME;

# ファイルをfindで検索してput先にputする。
open (FNAME,qq(/usr/bin/find . -type f|));
while (){
  chomp;
  print qq($_\n) unless($_ eq '.');
  my $dn=`dirname $_`;
  my $fn=`basename $_`;
  chomp($dn);
  chomp($fn);
 print qq(DIR $dn\nFILE $fn\n);
 $ftp->cwd($dn);
 if($ret eq ''){
   print qq(cwd error \[$dn\]\n);
   exit 1;
 }
 $ret=$ftp->put($_);
 if($ret eq ''){
   print qq(put error \[$_\]\n);
   exit 1;
 }
 $ftp->cwd($to);
}
close FNAME;

1;

perlスクリプトではありますが、
Linuxコマンドをいくつか使っているので、Windowsでは動作しません。
今見るとfindをフルパスで指定していたり、駄目ですね^^;
なぜわざわざfindを使っているかというと、ファイルのフルパスでの取得が綺麗にできるからです。
このスクリプトの欠点は、前にもいいましたが、すべてのファイルを転送してしまう点です。
これをファイルの変更がなかったら何も転送しないように修正していこうと思います。

続きます。