使 scp 始終覆蓋或建立目錄

使 scp 始終覆蓋或建立目錄

我正在使用 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。

相關內容