我有大量文件,需要将它们上传到具有特定目的地的远程计算机。我有一张地图(可以重新组织)作为
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
我可以想到两种解决方案:
上传到特定目的地
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
但拥有数千个scp
连接效率不高。
问题:如何使用类似的方法在一个连接中上传多个文件(为了速度)scp
?
使用rsync上传然后批量重命名
我可以使用 上传整个文件夹rsync
到临时文件夹,速度相当快。然后,根据上图重命名文件。
问题:如何使用给定地图批量重命名?
答案1
第三种解决方案要求所有源文件都位于同一文件系统上,因此可以任意对任何文件进行硬链接。
将文件映射存储在 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
然后使用此脚本创建一个名为 的临时输出目录,temp
其中将包含与文件映射的目标路径匹配的子目录。每个源文件名将依次硬链接到目录下的正确目标路径temp
。一旦temp
完全填充,它将被rsync
编辑到本地user:ip
计算机,然后从本地计算机中删除。
#!/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