2012-12-06 70 views
3

是否有可能獲取使用scp -r下載的文件列表?如何獲得使用scp -r下載的文件列表

實施例:

$ scp -r [email protected]:~/backups/ . 

3.tar 100% 5  0.0KB/s 00:00  
2.tar 100% 5  0.0KB/s 00:00  
1.tar 100% 4  0.0KB/s 00:00 

預期結果:

3.tar 
2.tar 
1.tar 
+0

嘗試使用history'和'grep'之間'的組合。這將只列出從當前會話下載的文件。 –

回答

2

的輸出scp生成似乎不出來上的任何標準的流(stdout或stderr),所以直接捕獲它可能很困難。你可以這樣做的一種方法是使scp輸出詳細信息(通過使用-v開關),然後捕獲並處理這些信息。詳細信息輸出在stderr上,因此您需要使用2>redirection operator來捕獲它。

例如,捕獲詳細的輸出做:

scp -rv [email protected]:~/backups/ . 2> scp.output 

然後你就可以將此輸出,這樣的篩選:

awk '/Sending file/ {print $NF}' scp.output 

awk命令簡單地打印硬道理在相關的線上。如果你的文件名中有空格,那麼你可能需要一個更強大的過濾器。

+0

不幸的是,如果發生任何錯誤,這種方法也會從輸出中省略錯誤,從而將錯誤隱藏爲任何自動化過程的一部分。 –

1

我知道你問的問題關於scp,但我會使用ssh,並獲得被複制文件名給你從遞歸服務器的替代解決方案的問題複製文件。

scp解決方案至少有一個問題:如果你複製大量文件,它需要一段時間,因爲每個文件生成交易。取而代之的scp,我用sshtar

ssh [email protected]:~/backups/ "cd ~/backups/ && tar -cf - ." | tar -xf - 

就這樣,加入teetar -t給你你需要什麼:

ssh [email protected]:~/backups/ "cd ~/backups/ && tar -cf - ." | tee >(tar -xf -) | tar -tf - > file_list 

注意,它可能無法在所有殼工作(慶典是好的),因爲>(...)構造(過程替代)不是一般選項。如果沒有它在你的shell,你可以使用一個FIFO(基本進程替換允許什麼,但更短):

mkfifo tmp4tar 
(tar -xf tmp4tar ; rm tmp4tar;) & 
ssh [email protected]:~/backups/ "cd ~/backups/ && tar -cf - ." | tee -a tmp4tar | tar -tf - > file_list 
0
scp -v -r yourdir [email protected]:/home/orczhou/ \ 
2> >(awk '{if($0 ~ "Sending file modes:")print $6}') 

與-v「發送文件模式:C0644 7864 a.sql」應是輸出中到stderr

使用「的awk」挑出來的文件列表

相關問題