c/fe

http://d.hatena.ne.jp/uzulla から移行しました。

今日もPerl、Net::FTPでサーバー内のファイルを全部リスト出力する

仕事で大量にあるサーバーの中身をクロールしてファイル数などを勘定する必要があったので。


正直Getopt::Longのちゃんとした使いかたがわかってない。無駄な使われ方もいい所。
@tomitaさんのCPAN本の書き方だとなぜかエラーになったなー…。

#!perl

# perl c.pl --h='great.website.com' --u='famous_username' --p='super_strong_pass' --b='/htdocs' > file.list


use Net::FTP;
use warnings;
use strict;
use feature 'say';
use Getopt::Long;
use Data::Dumper;

my $opt = {
	h=>'localhost',
	u=>'web',
	p=>'pass',
	d=>'/htdocs',
};
GetOptions($opt, qw/h=s u=s p=s b=s/) or exit 1 ;

my $HOSTNAME = $opt->{h};
my $USERNAME = $opt->{u};
my $PASSWORD = $opt->{p};
my $BASE_DIR = $opt->{b};

my $ftp = Net::FTP->new($HOSTNAME, Debug => 0)
      or die "Cannot connect: $@";

$ftp->login($USERNAME, $PASSWORD) or warn("Login Error!\n");
listing($ftp, $BASE_DIR);
$ftp->quit;


sub listing{
	my ($ftp, $dirname) = @_;
	
	say $dirname ."/" ;
    $ftp->cwd($dirname);
    my @dir = $ftp->dir;

    my @file_names = grep /^\-/, @dir;
    my @file_names_full = @file_names[2..$#file_names];
    my @file_names_short = map { (split)[8]  } @file_names_full;

    foreach(@file_names_short){
		say " " x length($dirname), "+". $_;
    }

	my @dir_names = grep /^d/, @dir;
	my @dir_names_full = @dir_names[2..$#dir_names]; 
	my @dir_names_short = map { (split)[8]  } @dir_names_full;
	foreach(@dir_names_short){
		listing($ftp, $dirname."/".$_);
	}
    $ftp->cwd($dirname);
}


あれだよね、やっぱ @list = grep /^d/ @fromlist; とか say " " x $num ; っていいよね。phpでコレ書くのforで回すのかよって感じになるし。
まあ、こういうの使わないほうが、他人に渡す時(5年後の自分含む)読めるんだけどさ…