2016-06-09 41 views
0

我在下面有一些pseduocode,想知道它是否會工作/是在開始開發代碼之前解決問題的最佳方法。Shell scipt:查找是否在另一臺服務器上的特定目錄中存在文件名

我需要在一臺服務器上動態搜索一個目錄,並確定它是否存在於另一臺服務器上。路徑將會不同,所以我使用basename並將其保存爲臨時變量。

​​

假若該文件在其他服務器上存在此if語句返回true?

回答

2

這是一個正常運作的,更清潔的實現你的邏輯:

for FILE in *; do 

    if ssh [email protected]_serverip test -e "$FILE"; then 
    # write code here 
    fi 

done 

(不會有在當代碼是由這種方式文件的路徑,所以你不需要basenametest -e "$FILE"如果文件存在,將靜默地退出0(真),如果文件不存在,將靜默地退出1(假),但如果連接失敗,ssh也將退出並顯示錯誤代碼。

但是,這是解決您的問題的非常昂貴的方式。如果當前目錄中有太多文件,它將失敗,並且每個文件運行一次ssh

你最好先獲取遠程文件的列表,然後檢查反對:

#!/bin/sh 

if [ "$1" != "--xargs" ]; then # this is an internal flag 

    (
    ssh [email protected]_serverip find . -maxdepth 1   # remote file list 
    find . -maxdepth 1         # local file list 
) |awk '++seen[$0]==2' |xargs -d "\n" sh "$0" --xargs # keep duplicates 

else 

    shift # remove the --xargs marker 
    for FILE in "[email protected]"; do 
    # write code here using "$FILE" (with quotes) 
    done 

fi 

這做了兩兩件事。首先,由於在運行腳本時沒有給出內部--xargs,因此它連接到遠程服務器並獲取主目錄中所有文件的列表。例如,這些將被列爲./.bashrc。然後在本地生成相同的列表,並將結果傳遞給awk

awk命令從它看到的每個項目構建一個關聯數組(哈希),遞增它然後檢查總數與數字二。它打印它看到的任何行的第二個實例。然後傳遞給xargs,指示使用\n(換行符)作爲分隔符而不是任何空格字符。

注意:如果您有任何文件的名稱中有換行符,此代碼將會中斷。不要這樣做。

xargs然後遞歸調用該腳本,從而通過每個文件else條款,我們循環。如果文件太多,請注意此腳本可能有多個實例(請參閱man xargs)。

 

此代碼需要GNU xargs。如果您使用的是BSD或其他不支持xargs -d "\n"的系統,則可以使用perl -pe 's/\n/\0/' |xargs -0

1

如果ssh成功退出,它將返回true。 您是否試過命令替換和解析find的輸出?

相關問題