我有大量的文件,需要将它们上传到具有特定目的地的远程计算机上。我有一张地图(可以重新组织)
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我能想到两种解决方案:
Uploading到特定目的地
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的Uploading,然后批重命名
我可以上传整个文件夹与rsync,这是相当快,到一个临时文件夹。然后,根据上面的地图重命名这些文件。
问:如何用给定的地图批次重命名?
发布于 2021-04-23 22:06:31
第三种解决方案要求所有源文件都位于同一个文件系统上,因此硬链接可以任意设置到任何文件。
将文件映射存储在文件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 temphttps://unix.stackexchange.com/questions/646456
复制相似问题