# HG changeset patch # User Heiko Schlittermann (ZARAFA.ctq.de) # Date 1304002491 -7200 # Node ID 2c1f279d393941e9be79286e020dca183c1cd863 # Parent 3c861b5ebe9cd7619e1c034a329b231cab6ba355 added listing option diff -r 3c861b5ebe9c -r 2c1f279d3939 ftpipe --- a/ftpipe Tue Dec 29 22:32:16 2009 +0100 +++ b/ftpipe Thu Apr 28 16:54:51 2011 +0200 @@ -1,11 +1,12 @@ #! /usr/bin/perl + +use 5.010; use strict; use warnings; use File::Temp; use Pod::Usage; use Getopt::Long; use if $ENV{DEBUG} => qw(Smart::Comments); -use feature qw(say switch); my $opt_put = 0; my $opt_get = 0; @@ -20,8 +21,8 @@ GetOptions( "p|put!" => sub { $opt_cmd = "put" }, "g|get!" => sub { $opt_cmd = "get" }, - - #"l|ls!" => + "l|ls!" => sub { $opt_cmd = "ls" }, + "d|L|ll|dir!" => sub { $opt_cmd = "dir" }, #"r|rm!" => "debug!" => \$opt_debug, "h|help" => sub { pod2usage(-verbose => 1, -exit => 0) }, @@ -34,7 +35,8 @@ ### %ftp die "need hostname" if not defined $ftp{host}; - die "need filename" if not defined $ftp{file}; + die "need filename" if not defined $ftp{file} + and $opt_cmd ~~ [qw(put get)]; my $ftp = new FTP($ftp{host}, Debug => $opt_debug, Passive => 1); $ftp->login($ftp{user}, $ftp{pass}); @@ -44,22 +46,25 @@ given ($opt_cmd) { when ("put") { $ftp->put(*STDIN, $ftp{file}) } when ("get") { $ftp->get($ftp{file}, *STDOUT) } + when ("ls") { say join "\n", sort $ftp->ls }; + when ("dir") { say join "\n", sort $ftp->dir }; default { pod2usage }; } exit; - $ftp->put(*STDIN, $ftp{file}); - print $ftp->dir, "\n"; - } sub parse_url($) { $_[0] =~ m{^ftp:// (?:(?.*?)(?::(?.*))?@)? (?[a-z\d_\.]+)/ - (?:(?.+)/)?(?\S+)?}x; - return my %r = %+; + (?.*)}x; + my %r = %+; + + ($r{dir}, $r{file}) = $r{path} =~ /^(?:(.*)\/)?(.*)?/; + + return %r; } { @@ -112,20 +117,32 @@ ftpipe --put ftp://[user[:pass]@]server/dir/file ftpipe --get ftp://[user[:pass]@]server/dir/file + ftpipe --ls ftp://[user[:pass]@]server/dir/[file] + ftpipe --dir ftp://[user[:pass]@]server/dir/[file] =head1 OPTIONS =over +=item B<-d>|B<--dir> + +Show a long listing to stdout. The listing is sorted, but by line, not +by then file names! Take care to end the URL with a slash B if you +want to see the contents of a directory! + =item B<-g>|B<--get> Get the file from the remote server and print it to stdout. +=item B<-l>|B<--ls> + +Show a (probably short) sorted listing to stdout. +See above at B<-d> for the notice about the trailing slash. + =item B<-p>|B<--put> Put the data read from stdin to the remote file. - =back =head1 FILES