Linux – move all files in local directory to remote directory

bashlinuxscpsftpssh

I want to move all files in local directory to remote directory.

And I am using this code to achieve it

 SOURCE_FILE=/var/www/oneserver/*
 TARGET_DIR=/var/www/anotherServer
 ARCHIEVEFILE=/var/www/archieveServer

/usr/bin/expect<<EOD
spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "password:"
send "$PASSWORD\r"
expect "sftp>"
send "put $SOURCE_FILE $TARGET_DIR\r"
expect "sftp>"
send "bye\r"
EOD 

It works fine, but sometime it stops and only send some files.

I also want to move the already sent file to ARCHIEVEFILE by using mv command. But dont get idea how to move it. I can't use scp because the remote server not allowed using basic port, and the only way is using sftp.

Can anybody help, please?

[EDIT]

the $ARCHIEVEFILE is still the local server, just to backup/move so those files are not sent anymore with next cronjob

the TARGET_DIR is the remote server.

Best Answer

There's no command in OpenSSH sftp to move files to remote directory.

What you can do is to:

  • use sftp put to upload the files (as you are doing already), and then
  • use shell rm command to delete the files after sftp is done (i.e. after EOD):

    rm $SOURCE_FILE
    

    Or use ! to escape to shell from sftp script, after you sent put:

    send "!rm $SOURCE_FILE\r"
    expect "sftp>"        
    

Of course, this is not an atomic solution. If a file is added between put and rm, it will be lost. For an atomic solution, you have to iterate files in a local directory and upload and delete them one by one. Also for a robust solution, you need to check if an upload was successful.

Related Question