cdlaforc has asked for the wisdom of the Perl Monks concerning the following question:

Hello, I would like to use net::sftp to get a list of files from a directory on a server and then use that list to get or remove files. Can anyone offer me any direction? Thanks, Chris.
  • Comment on net::sftp remove storing files for get and remove

Replies are listed 'Best First'.
Re: net::sftp remove storing files for get and remove
by jethro (Monsignor) on Aug 05, 2011 at 23:59 UTC

    Where do you have problems? I would suggest reading the Net::SFTP documentation, then starting with the code example in the Synopsis section. Find the function to get a directory listing, use it and print the result out to the user, line by line with a counter in front. Let the user give you the number of the file he wants. Fetch that.

    It isn't that difficult. Just write the code step by step. If you have a specific problem, ask

      Hello, Thanks for the response. I messed around with some examples a little bit, and was able to get a file listing, but am having problems retriving the files now using that listing. Let me know if you have any ideas. Also, I noticed in my list that I have a "." for the current directory and ".." for the parent directory. Any ideas for how to exclude these?
      #!/usr/bin/perl -w use Net::SFTP::Foreign; my $host = 'xxxx.xxxxxxxxxx.com'; my $sftp = Net::SFTP::Foreign->new($host, user=>'username', password=>'password'); $sftp->die_on_error("Unable to establish SFTP connecti +on"); my @files = $sftp->ls('/xxxx/xxxxx/outbound'); foreach my $f ( @files ) { foreach my $file_ref ( @{$f} ) { #print "$file_ref->{'filename'}\n"; $sftp->get("/xxxx/xxxxx/outbound/$file_ref->{'filename'}","/xx +x/xxx/xxx/local_inbound/"); } }
      Thanks, Chris.

        Not really a bug, but since $sftp->ls returns a single scalar, i.e. an array reference, the outer loop seems to be superfluous. If you print out @files and you see only something like "ARRAY(0x734657)", you can change this part of the script to

        my $f = $sftp->ls('/xxxx/xxxxx/outbound'); # $f instead of @files #removed a loop here foreach my $file_ref ( @{$files} ) {

        To remove the dirs you might take a look at grep, which works similar to the command line grep:

        my @files= grep (!/^\.\.?$/, @files); #or without regex my @files= grep ($_ ne "." and $_ ne "..", @files);

        The rest looks good. Without knowing what problem you have with it I can't help you. What error message do you get?