SCP recursive file transfer order

scpssh

Wondering whether it's possible to specify a sort order when transferring files with scp.

For example:
$ scp -r "user@host:/path/to/download/" .

[... files download in a seemingly random order ...]

Since perhaps this may be related to how scp functions, is there some way to configure ssh on the source(server)-side so that files are transfered, for example, in ascending filename order?

Best Answer

I whould solve the problem with tar and the pipe-transparency of ssh. An example can be seen below, the remote PC is named bar. Before the test, I created three empty files in /tmp/foo by executing ssh bar 'mkdir /tmp/foo ; touch /tmp/foo/{a,b,c}'.

$ ssh bar 'cd /tmp/foo ; ls | sort -r | tar -cT -' | tar -xv
c
b
a
$ ls -l a b c
-rw-r--r-- 1 dnet dnet 0 nov   29 17:07 a
-rw-r--r-- 1 dnet dnet 0 nov   29 17:07 b
-rw-r--r-- 1 dnet dnet 0 nov   29 17:07 c

The -T flag of tar makes it read filenames to pack from the next parameter, and - means the standard input. Now you just need to pipe the name of the files into it, which can come from ls (as in the example) or find for trickier tasks. With this setup, you can use sort to indicate the exact order the files will be transmitted through SSH (in this case, -r sorted files in reverse alphabetic order). The -v is only added to the final, unpacking tar, so that the order is visible.

Related Question