How to create directory if doesn't exists in sftp

man 1 sftp (from openssh-client package):

-b batchfile

    Batch mode reads a series of commands from an input
    batchfile instead of stdin. Since it lacks user
    interaction it should be used in conjunction with
    non-interactive authentication. A batchfile of ‘-’
    may be used to indicate standard input. sftp will
    abort if any of the following commands fail: get,
    put, reget, reput, rename, ln, rm, mkdir, chdir, ls,
    lchdir, chmod, chown, chgrp, lpwd, df, symlink, and
    lmkdir. Termination on error can be suppressed on a
    command by command basis by prefixing the command
    with a ‘-’ character (for example, -rm /tmp/blah*).

So:

{
  echo -mkdir dir1
  echo -mkdir dir1/dir2
  echo -mkdir dir1/dir2/dir3
} | sftp -b - $user@$host

I understand this thread is old and has been marked as answered but the answer did not work in my case. The second page on google for a search regarding "sftp checking for directory" so here is an update that would have saved me a few hours.

Using an EOT you cannot capture the error code resulting from the directory not being found. The work around I found was to create a file containing instructions for the call and then capture the result of that automated call.

The example below using sshpass but my script also uses this same method authenticating with sshkeys.

Create the file containing the instructions:

echo "cd $RemoteDir" > check4directory
cat check4directory; echo "bye" >> check4directory

Set permissions:

chmod +x check4directory

Then make the connection using the batch feature:

export SSHPAA=$remote_pass
sshpass -e sftp -v -oBatchMode=no -b check4directory $remote_user@$remote_addy

Lastly check for the error code:

if [ $? -ge "1" ] ; then
  echo -e "The remote directory was not found or the connection failed."
fi

At this point you can exit 1 or initiate some other action. Note that if the SFTP connection fails for another reason like password or the address is incorrect the error will trip the action.


Another variant is to split the SFTP session into two.

First SFTP session simply issues the MKDIR command.

Second SFTP session can then assume existence of the directory and put the files.


You can use the SSH access of your account to first verify if the directory exists at all (using the "test" command). If it returns exit code 0, the dir exists, otherwise it doesn't. You can act on that accordingly.

# Both the command and the name of your directory are "test"
# To avoid confusion, I just put the directory in a separate variable
YOURDIR="test"

# Check if the folder exists remotely
ssh [email protected] "test -d $YOURDIR"

if [ $? -ne 0 ]; then
  # Directory does not exist
  sftp [email protected] << EOF
  mkdir test
  put test.xml
  bye
  EOF
else
  # Directory already exists
  sftp [email protected] << EOF
  put test.xml
  bye
  EOF
fi