0

I have a large set of files and need to upload them to a remote machine with specific destinations. I have a map (can be re-organised) as

1/1/1/file.jpg -> 2/3/4/image1.jpg
2/12/2/file.jpg -> 5/6/7/image2.jpg
3/31/31/file.jpg -> 8/9/1/image3.jpg

I can think of two solutions:

Uploading to specific destinations

scp /folder/1/1/1/file.jpg user@ip:/dir/2/3/4/image1.jpg
scp /folder/2/12/2/file.jpg user@ip:/dir/5/6/7/image2.jpg
scp /folder/3/31/31/file.jpg user@ip:/dir/8/9/1/image2.jpg

but it is not efficient to have thousands of scp connections.

Question: How can I upload multiple files in one connection (for the sake of speed) with a method like scp?

Uploading with rsync and then batch rename

I can upload the entire folder with rsync, which is quite fast, to a temporary folder. Then, rename the files according to the above map.

Question: How can I batch rename with a given map?

1 Answer 1

1

A third solution requires that all of the source files are on the same filesystem, and thus hard links can be made arbitrarily to any of the files.

Store your file map in file filemap.txt:

$ cat << EOF > filemap.txt
1/1/1/file.jpg -> 2/3/4/image1.jpg
2/12/2/file.jpg -> 5/6/7/image2.jpg
3/31/31/file.jpg -> 8/9/1/image3.jpg
EOF

Then use this script to create a temporary output directory named temp which will contain sub-directories matching the destination paths of your file map. Each source filename will in turn be hard-linked into its proper destination path under directory temp. Once temp is fully populated, it will be rsynced to user:ip and then deleted from the local machine.

#!/usr/bin/env bash

srcD="/folder/"
destD="/dir/"

rm   -rf temp

while read  src X dest
do

        dir="$(dirname "$dest")"

        mkdir -p "temp/$dir"
        ln "$srcD$src" "temp/$dest"

done < filemap.txt

rsync -av temp/ user@ip:"$destD"

rm -rf temp
4
  • brilliant solution indeed, because I have to create the map file. With this idea, I directly create symbolic links instead of the map file. Commented Apr 23, 2021 at 22:51
  • your rsync command needs L. Commented Apr 23, 2021 at 23:30
  • @Googlebot Probably because you're using symbolic links, whereas my example uses hard links. Commented Apr 24, 2021 at 6:06
  • you're absolutely right. Is there any benefit to using a hard link here? I gather a soft link might be more convenient as the purpose is temporary. Commented Apr 24, 2021 at 11:41

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.