#!/usr/bin/perl use strict; use warnings; use Getopt::Long qw(GetOptions); use Net::FTP qw(); use Data::Dumper qw(Dumper); use File::Find qw(find); use File::Basename qw(dirname basename); my $VERSION = '0.01'; my %opt = ( port => 21, debug => 0, passive => 0, ); GetOptions(\%opt, "source=s", "user=s", "password=s", "host=s", "port=s", "remote=s", "passive", "debug", "help", ) or usage(); usage() if $opt{help}; #die Dumper \%opt; my $ftp = Net::FTP->new($opt{host}, Debug => $opt{debug}, Passive => $opt{passive}, ) or die "Could not connect to $opt{host}"; $ftp->login($opt{user}, $opt{password}) or die; # create root dir on remote if does not exist if (not $ftp->cwd($opt{remote})) { $ftp->mkdir($opt{remote}, 1) or die "Could not create $opt{remote}"; $ftp->cwd($opt{remote}) or die "Could not cwd to remote dir $opt{remote}"; } my $cnt; my %dir_seen; find({ wanted => \&upload_file, no_chdir => 1 }, $opt{source}); ######################################### sub upload_file { #return if $cnt++ > 320; return if length $_ < 1+length $opt{source}; print "$_\n"; my $path = substr($_, 1+length($opt{source})); my $dir = dirname $path; my $file = basename $path; print "DIR: $dir\n"; my $remote_dir = $opt{remote}; if ($dir ne '.') { $remote_dir .= "/$dir"; } my $remote_path = "$remote_dir/$file"; if (not $dir_seen{$remote_dir}++) { $ftp->mkdir($remote_dir, 1); } return if -d $_; print "put $_ $remote_path\n"; $ftp->put($_, $remote_path); } sub usage { print <<"END_USAGE"; v$VERSION Usage: $0 --source local source file or directory --username USERNAME --password PASSWORD --host host --port port --remote remote directory --debug --help END_USAGE exit; }