When I try to use sftp to transfer a directory containing files, I get an error message:
skipping non-regular file directory_name The directory contains a couple of files and two subdirectories.
What am I doing wrong?
sftp, like cp and scp, requires that when you copy a folder (and its contents, obviously), you have to explicitly tell it you want to transfer the folder recursively with the -r option.
So, add -r to the command.
-r to the sftp command when you're connecting. sftp -r user@host Couldn't canonicalise: No such file or directory. # sftp user@remote-host #> get -r remote-folder I can only suggest, you use rsync. It is somewhat of an industry standard, when moving files over secure connections.
rsync -alPvz ./source_dir server.com:destination_dir It is what I've been using for years by now.
(the -a option takes care of things like directory recursion)
-a = recursion + keep symbolic links, permissions, modification times, owner, group, special files and device files (the latter requires super-user privileges); -l = keep symbolic links (already included in -a); -P = show progress during the transfer + keep partially transferred files; -v = verbose mode (however it seems mandatory when using -P to avoid a weird (bug?) protocol version mismatch error); -z = enable compression of transferred data. -l switch has to be used or not. I remember older versions didn't include -l in -a. This works for me:
1) connect via sftp to remote host
2) change into the remote directory you wish to copy. (Example: cd Music)
3) change to the local directory you wish to copy stuff to. (Example: lcd Desktop)
4) Issue this command: get -r *
get -r remote/folder/*.xml local/folder/ You may also be able to use use scp. The general format is
scp -rp sourceDirName username@server:destDirName scp means "secure copy". The flags are
-r recurse into subdirectories-p preserve modification timesI believe the rest of the items are self-explanatory
-C flag for compression (both scp/sftp). btw - scp uses sftp under the hood since OpenSSH 9 - see also openssh.com/txt/release-9.0 If you question is actually 'how do I use sftp to transfer a directory', then
sftp -r user@server But if you transferring a directory, I might suggest two better options, depending on your needs. sftp requires logging into the remote server in a ssh-like command prompt, but if all you want is the file(s), there are easier and quicker ways.
Scp
For a one time transfer, to upload try:
# upload source directory to remote server scp -rp source_dir user@server:dest #download directory from remote server: scp -rp user@server:source_dir dest #specifying ssh key: scp -rp -i ~/.ssh/key user@server:source_dir dest #remote directory has spaces scp -rp -i ~/.ssh/key user@server:"source\\ dir" dest Rsync
If you plan on syncing the directories on a regular basis, using rsync makes more sense. It performs deltas between the two directories, saving transfer time and data over the wire.
rsync -r -a -v -e ssh --delete source_dir user@server:dest Here is a list of some of the most common rsync options: (taken from here)
Hope that helps!
If rsync is not an option, I would next recommend lftp:
lftp sftp://[email protected]/path/path/ To download recursively from server use:
mirror To upload recursively to server use:
mirror -R Note that recursion is the default behavior. The -R is for reverse — to make the mirror command upload instead of download. Use --dry-run to make sure it's doing what you expect.
To download without recursion use:
mirror --no-recursion You have to cd into the directories you want to mirror. Works great!
If you can, use sshfs. It's a FUSE filesystem, available on most modern unices, and works with any SFTP server. This is a remote filesystem: it allows you to manipulate remote files (over the SFTP protocol) with the usual utilities.
mkdir /mount/point sshfs server.example.com:/remote/path /mount/point ls /mount/point cp -Rp /mount/point/somedir /local/location fusemount -d /mount/point It's a bit of a kludge but what works for me is to:
ssh to login to the remote machine sftp from the remote machine to your local machine get command with the -r option to move the directory and all of its files.sftp> get -r data /opt/bin get: Invalid flag -r you can get from the server to your local path by
scp -rp user@server:directoryname(full path) . It's a workaround,
SFTP.get *.[file format]. Example: If you have many files with .csv format, then use,get *.csv I had the same need when I was already connected via sftp, and I didn't want to reconnect using -r param because in my case it's a bit annoying. There's a proxy which I have to connect first and then use a 2 factor token.
So, to avoid that, I did the following workaround: I compressed the folder using another ssh session and moved the resulting file on my sftp session.
SSH
tar -czvf myfolder.tar.gz myfolder SFTP
put myfolder.tar.gz /server-path-name Then, in the server (SSH), I extracted the folder by using:
tar -xzvf myfolder.tar.gz If you're transferring a big amount of data, this workaround might be rather useful because it helps reducing the amount of data transferred and thus, the total transfer time.
-C for compression with sftp, which would also reduce the amount transferred