今日も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年後の自分含む)読めるんだけどさ…