2015-06-19 59 views
2

我剛剛接觸bash腳本,現在我正在研究一個bash腳本,它應該使用scp命令從服務器下載文件列表。但是,不能保證該文件在那裏,所以我希望能夠輸出未找到的文件列表。目前,我這樣做是爲了輸出錯誤信息:程序結束時的Bash輸出

for FILENAME in [email protected] do 
scp $SERVER:/home/usr/$FILENAME . 
    if [ $? -ne 0 ] then 
    echo "WARNING: $FILENAME was not found in $SERVER." 
    fi 
done 

上面的代碼工作,據我所知,但我遇到的問題是,由於如何SCP的作品,還有的已經將是一噸(因爲每個scp命令將顯示100%下載的行),並且我可能會錯過一兩條警告消息。有沒有簡單的方法讓我最終打印所有警告消息,並列出哪些文件未找到?

編輯:我忘了說明爲什麼我使用回聲而不是默認的「文件未找到」 - 我的代碼實際上應該在多個位置查找,如果它無法在第一個位置找到它。所以,更完整的版本看起來有點像這樣:

for FILENAME in [email protected] do 
scp $SERVER:/home/usr/$FILENAME . 
    if [ $? -ne 0 ] then 
     scp $SERVER:/home/usr/documents/$FILENAME . 
     if [ $? -ne 0 ] then 
     scp $SERVER:/home/usr/documents/local/$FILENAME . 
     if [ $? -ne 0 ] then 
      echo "WARNING: $FILENAME was not found in $SERVER." 
     fi 
     fi 
    fi 
done 

如果沒有在第一位置上找到它,這很好,但我只希望它拋出一個錯誤,如果我不能找到它在任何地點。

+0

使用'-q'來告訴'scp'安靜?在最後再次循環參數並查看本地文件是否存在?不要回應'if'追加到數組變量並在最後打印該數組?改爲回到標準錯誤,並將其傳遞到文件或管道標準輸出到'/ dev/null'從'scp'? –

+0

@Etan Reisner:似乎'-q'只隱藏進度表,而不是stderr。 –

+0

來自scp的關於文件不存在/失敗的stderr可能是OP實際需要的信息(因爲它爲他們完成了工作)。除非scp提供stderr上的其他非失敗信息,也就是說。 –

回答

1

最簡單的(雖然不是最有效的解決方案)是簡單地檢查文件最後的存在。

原始循環後補充一點:

for FILENAME in [email protected] do 
    if [ -s "$FILENAME" ] then 
     echo "WARNING: $FILENAME was not found in $SERVER." >&2 
    fi 
done 

或者如果正常SCP輸出不是有趣的(你不關心其他潛在的SCP失敗),那麼原來的循環可能會成爲:

for FILENAME in [email protected] do 
scp -q $SERVER:/home/usr/$FILENAME . 2>/dev/null 
    if [ $? -ne 0 ] then 
     scp -q $SERVER:/home/usr/documents/$FILENAME . 2>/dev/null 
     if [ $? -ne 0 ] then 
     scp -q $SERVER:/home/usr/documents/local/$FILENAME . 2>/dev/null 
     if [ $? -ne 0 ] then 
      echo "WARNING: $FILENAME was not found in $SERVER." 
     fi 
     fi 
    fi 
done 

如果你想SCP輸出(正常或錯誤或兩者),但也希望丟失的文件在最後一個簡潔的列表,你可以這樣做:

missing_files=() 
for FILENAME in [email protected] do 
scp $SERVER:/home/usr/$FILENAME . 
    if [ $? -ne 0 ] then 
     scp $SERVER:/home/usr/documents/$FILENAME . 
     if [ $? -ne 0 ] then 
     scp $SERVER:/home/usr/documents/local/$FILENAME . 
     if [ $? -ne 0 ] then 
      missing_files+=("$FILENAME") 
     fi 
     fi 
    fi 
done 

echo 'Missing files:' 
printf %s\\n "${missing_files[@]}" 
+0

最後一個是我正在尋找的;謝謝! – Glamdring

3

你可以在腳本的末尾scp命令的標準錯誤重定向到一個文件,然後cat出來的文件:

for FILENAME in [email protected] do 
scp $SERVER:/home/usr/$FILENAME . 2>> /some/dir/error.log 
    if [ $? -ne 0 ] then 
    echo "WARNING: $FILENAME was not found in $SERVER." 
    fi 
done 

cat /some/dir/error.log 
rm /some/dir/error.log 
+2

'2 >>/some/dir/error.log'? –

+0

好的。我們正在循環。糾正。 – JNevill

+0

2 >>中的數字2是什麼意思? 2 >> /some/dir/error.log似乎將所有的輸出結果放到一個日誌文件中,然後輸出它,但我只需要知道哪些文件在所有列出的文件中都找不到位置(請參閱我的原始帖子上的編輯) – Glamdring