
我正在使用 scp 將目錄從一台遠端伺服器複製到另一台遠端伺服器上的新目錄(IE 只是更改名稱),例如:
scp -prq server1:dir1 server2:dir2
如果 server2 上不存在 dir2,則此方法可以正常運作,它會建立一個名為 dir2 的新目錄,其中包含 server1 上 dir1 中的所有內容。
當dir2 已經存在於server2 上時,問題就出現了(注意:我無法提前知道這一點,也無法事先在server2 上刪除dir2) - 發生的情況是我在dir2 中獲得了dir1 的副本,稱為dir1 。
我確信我缺少一些基本的東西,但我似乎無法解決它。
非常感謝任何幫助!
問候,
賈爾斯
好的,我的代表人數少於 10 人,不能等待 8 小時,所以這是我得到的:
這是一個適合我的腳本:
#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "failed ... trying method 2"
scp -prq server1:dir1 server2:dir2
fi
exit
仍然不確定如何在單一命令中執行此操作,或者即使可能。
乾杯@mindthemonkey,有時僅僅獲得一個新的觀點就可以幫助指明方向。
答案1
使用這個「點」語法:
scp -prq server1:dir1/. server2:dir2/
這會複製該目錄的內容,而不是目錄本身。我相信它比*
通配符更便攜。
答案2
通常要控制目錄創建,您需要使用尾隨/
來暗示完整路徑,但我認為如果目錄不存在,這將無法建立目錄:
scp -prq server1:dir1/* server2:dir2/
這也可能是隱藏的錯過。由於 * glob 擴充功能而產生的檔案(沒有一些棘手的 shell 特定工作)
ssh
您可以使用和進行不同的處理tar
。
ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"
但這意味著流量會通過您的本機電腦。
答案3
首先使用 ssh 清除它,然後使用 scp 重新建立它。即在腳本檔中...
ssh -i ~/.ssh/[private_key] user@server2 "rm -rf dir2; 退出;"
scp -prq 伺服器1:目錄1 伺服器2:目錄2
答案4
我已經用我的頭去解決同樣的問題,而我最終所做的是半雙關:如果 dir2 是[STUFF]/parent/child2
,我將dir1 (根據具體情況)重命名或複製或鏈接到server1 上的dir1_child2 ,以便它的最後一個路徑元件也是child2
,然後執行
scp -prq server1:dir1_child2 server2:[STUFF]/parent
無論 child2 是否存在於 dir2 的父目錄中,它都會運行,如果存在,則愉快地替換 dir2。