我在下面有一些pseduocode,想知道它是否會工作/是在開始開發代碼之前解決問題的最佳方法。Shell scipt:查找是否在另一臺服務器上的特定目錄中存在文件名
我需要在一臺服務器上動態搜索一個目錄,並確定它是否存在於另一臺服務器上。路徑將會不同,所以我使用basename並將其保存爲臨時變量。
假若該文件在其他服務器上存在此if
語句返回true?
我在下面有一些pseduocode,想知道它是否會工作/是在開始開發代碼之前解決問題的最佳方法。Shell scipt:查找是否在另一臺服務器上的特定目錄中存在文件名
我需要在一臺服務器上動態搜索一個目錄,並確定它是否存在於另一臺服務器上。路徑將會不同,所以我使用basename並將其保存爲臨時變量。
假若該文件在其他服務器上存在此if
語句返回true?
這是一個正常運作的,更清潔的實現你的邏輯:
for FILE in *; do
if ssh [email protected]_serverip test -e "$FILE"; then
# write code here
fi
done
(不會有在當代碼是由這種方式文件的路徑,所以你不需要basename
)test -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
。
如果ssh
成功退出,它將返回true。 您是否試過命令替換和解析find
的輸出?