2012-08-30 106 views
2

我確信有一個簡單的方法可以做到這一點,但我沒有找到它。我想要做的是使用lftp執行一系列命令,並且我想避免在可能的情況下反覆連接到服務器。使用lftp執行動態命令 - 多個命令

基本上,我有一個文件,其中包含一個完整的ftp目錄在服務器上的列表。我想連接到服務器,然後執行類似如下:(假設在這一點上,我已經轉換的文本文件導入使用cat線的陣列)

for f in "${myarray}" 
do 
cd $f; 
nlist >> $f.txt; 
cd ..; 
done 

當然,這並不工作,但我不得不想像我有一個簡單的解決方案,我正在努力完成。

對於shell腳本,我很缺乏經驗。有什麼建議麼?

回答

5

首先構建一個包含lftp命令列表的字符串。然後調用lftp,在標準輸入上傳遞命令。 Lftp本身可以將命令的輸出重定向到文件,其語法類似於shell。

list_commands="" 
for dir in "${myarray[@]}"; do 
    list_commands="$list_commands 
    cd \"$dir\" 
    nlist >\"$dir.txt\" 
    cd .." 
done 

lftp <<EOF 
open -u $username,$password $site 
$list_commands 
bye 
EOF 

請注意,我假定目錄名不包含反斜槓,單引號或通配符。如有必要添加適當的轉義。請參閱Why is while IFS= read used so often, instead of IFS=; while read..?。您可能更願意將目錄列表中的讀數與構建命令相結合:

list_commands="" 
while IFS= read -r dir; do 
    list_commands="$list_commands 
    cd \"$dir\" 
    nlist >\"$dir.txt\" 
    cd .." 
done <directory_list.txt 
+0

謝謝。這正是我需要的。由於我(我沒有提到這一點)在一個窗口框中工作,所以有一些增加了行結尾的複雜性--->我認爲可能是錯誤的只有兩件事是關於你所說的(儘管這可能是因爲的窗戶)。我簡直無法讓它與名稱中有空格的目錄一起工作 - 這在運行時不會成爲問題,但它讓我在測試中感到困惑。另外,我必須在=符號後面加雙引號 - 它表示list_commands = $ list_commands才能使其工作。絕對讓我在需要的地方。謝謝! – user1167442

+0

@ user1167442缺少雙引號是錯誤的,修正了。如果您使用IFS = $'\ r'而不是'IFS =',則輸入文件可以具有Windows行結束符。有空間的目錄應該工作(我想,我還沒有測試過),出了什麼問題? – Gilles

+0

我嘗試了多個變體的轉義和繞過變量的雙引號,如下所示:cd \「$ dir \」,但是在服務器和輸出中都發生了什麼,它只將它讀作請求的第一部分 - 例如cd「Folder D」被解釋爲cd「Folder」「D」,並且輸出將在文件「Folder.txt」和「D.txt」中。不過,我並不太擔心它,因爲在運行時,它只能使用預先轉義的大寫非空格字符串。雖然奇怪。我用tr -d「\ r」很容易地處理了windows \ r問題。非常便利。 – user1167442