Bash
上傳文件到遠端伺服器並批量重命名
我有大量文件,需要將它們上傳到具有特定目的地的遠端電腦。我有一張地圖(可以重新組織)為
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
完全填充,它將被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