Bash

上傳文件到遠端伺服器並批量重命名

  • April 24, 2021

我有大量文件,需要將它們上傳到具有特定目的地的遠端電腦。我有一張地圖(可以重新組織)為

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到一個臨時文件夾,速度非常快。然後,根據上圖重命名文件。

*問題:*如何使用給定的地圖批量重命名?

第三種解決方案要求所有源文件都在同一個文件系統上,因此可以任意建立到任何文件的硬連結。

將文件映射儲存在文件中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,該目錄將包含與文件映射的目標路徑匹配的子目錄。每個源文件名將依次硬連結到 directory 下的正確目標路徑temp。一旦temp完全填充,它將被rsyncuser: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

引用自:https://unix.stackexchange.com/questions/646456