2015-04-24 213 views
5

我已經做了大量的搜索,並且似乎無法找到如何使用shell腳本執行此操作。基本上,我從遠程服務器複製文件,如果它不存在,我想做其他事情。我有一個數組下面,但我試圖直接引用它,但它仍然返回false。如何檢查使用shell的遠程服務器上是否存在文件

我在這個全新的,所以請善待:)

declare -a array1=('[email protected]'); 

for i in "${array1[@]}" 
do 
    if [ -f "$i:/home/user/directory/file" ]; 
    then 
    do stuff 
    else 
    Do other stuff 
    fi 
done 
+1

你看,你不能只是連接到另一臺主機,並檢查文件,你需要先ssh到它或有某種NFS來配置 –

+0

你可以只嘗試轉移和到'scp'錯誤代碼響應對於文件不存在(或其他錯誤條件)。假設你正在使用'scp'。 –

+0

在這兩種情況下,您是否需要在本地或遠程機器上執行某些操作? –

回答

2

假設你正在使用scpssh遠程連接這樣的事情應該做你想做的。

declare -a array1=('[email protected]'); 

for i in "${array1[@]}"; do 
    if ssh -q "$i" "test -f /home/user/directory/file"; then 
     scp "$i:/home/user/directory/file" /local/path 
    else 
     echo 'Could not access remote file.' 
    fi 
done 

另外,如果你並不一定需要關心的遠程文件不存在和其他可能的scp誤差之間的差異那麼下面會工作。

declare -a array1=('[email protected]'); 

for i in "${array1[@]}"; do 
    if ! scp "$i:/home/user/directory/file" /local/path; then 
     echo 'Remote file did not exist.' 
    fi 
done 
+0

啊!非常感謝!!我使用了第一個解決方案,因爲我需要做的比第二個選項似乎允許的更多,並且它似乎在第一次運行時正在進行。我將把它添加到完整的腳本中並嘗試一下。 – Brandy

+0

**它工作了!**現在做快樂的舞蹈。非常感謝你:) – Brandy

+0

如果你在'scp'成功時需要做某些事情,只需在第二個塊中添加一個'else'塊或者反轉邏輯(移除'!')並使用'else'塊失敗案例。 –

4

試試這個:

ssh -q $HOST [[ -f $i:/home/user/directory/file ]] && echo "File exists" || echo "File does not exist"; 

或像這樣:

if ssh $HOST stat $FILE_PATH \> /dev/null 2\>\&1 
then 
    echo "File exists" 
else 
    echo "File not exist" 
fi 
+0

周圍的報價將是必要的。 –

+0

此處'$ i'看起來就是所討論的主機,所以應該從路徑中分離出來並用在'ssh'命令中。 –

+0

我試過了,它仍然返回false爲所有情況。 – Brandy

相關問題