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

Hello monks,

EDIT: So I fixed my problem with the command using the wrong module it turns out that I just used some bad code. Now my question is just is there some way to use the rput command recursively so that it copies the folders into non existent folders like you would use the mkpath command?

I use the Net::SFTP::Foreign::Backend::Net_SSH2 backend to connect to my sftp server.

Is there some way to copy files into folders that don't exist and just create the folders that way? So It would look something like this if I wanted to copy a file to /root/b/c/a/s/d/s and only /root exists it would create the folders b, c, a, s, d, and s.

This is the relevant code:

if ($up_dir_local && $up_dir_remote) { print "Preparing to upload folder $up_dir_local to $up_dir_remote \n"; sleep 3; if ($sftp->rput($up_dir_local, $up_dir_remote)){ print "The directory \"$up_dir_local\" was uploaded to \"$up_dir_remot +e\""; } else { print "\"$up_dir_local\" or \"$up_dir_remote\" could not be found. Che +ck your path!"; } }



FIXED

I figured I could use mkpath somehow and incorporate it into the rput command. But whenever I use the mkpath command it try's to load from Net::SSH2::SFTP instead of Net::SFTP::Foreign. Since Net::SSH2::SFTP does not have this command it can't load mkpath. Is there a way to define from which module to load the command?

Replies are listed 'Best First'.
Re: Copy folder into non-existent folder on ftp server.
by WhiskeyJack (Initiate) on Aug 10, 2012 at 12:38 UTC

    So this is what I did:

    if ($up_dir_local && $up_dir_remote) { print "Preparing to upload folder $up_dir_local to $up_dir_remote \n"; sleep 3; if ($sftp->mkpath($up_dir_remote)){ if ($sftp->rput($up_dir_local, $up_dir_remote)){ print "The directory \"$up_dir_local\" was uploaded to \"$up_dir_remot +e\""; } else { print "\"$up_dir_local\" or \"$up_dir_remote\" could not be found. Che +ck your path!"; } } }

    And this works for copying folders where the mkpath command creates a folder before the rput command copies it. But this does not work for copying files because the mkpath command creates a folder with the files name where it places the file. My question now is how would I modify the mkpath command to ignore everything after the last '/' so that it doesn't create a folder with the files name.

      It would almost certainly be easier and quicker to tar/zip the directories; upload the archive and untar/zip it at the other end.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

      The start of some sanity?

        How would that be easier? I honestly don't know :D Isn't it simpler to just copy the file?

        This is the workaround I made for my problem but its not great seeing as the user has to input one more command

        if ($upload_local && $upload_remote && $up_dir) { print "Preparing to upload file $upload_local to $upload_remote \n"; sleep 3; if ($sftp->mkpath($up_dir)){ if ($sftp->put($upload_local, $upload_remote)){ print "The file \"$upload_local\" was uploaded to \"$upload_remote\""; } else { print "\"$upload_local\" or \"$upload_remote\" could not be found. Che +ck your path!"; } } else { print "\"$up_dir\" could not be found. Check your path!"; } }