2014-01-21 38 views
0

例如,在我遙遠的地方,有很多的名爲「file_1」到「file_50500000」轉儲文件,而我只需要從file_1000000文件與增量file_50500000爲100000SCP一系列文件

#!/bin/bash 
files="" 
for i in `seq -f '%9.0f' 1000000 100000 50500000`; do 
files="$files file_$i.dump" 
done 
scp [email protected]:/user/$files ./ 

錯誤是「沒有這樣的文件或目錄」。提前感謝您的任何建議。

+1

也許更好的UNIX交流問:http://unix.stackexchange.com/questions 或超級用戶:http://superuser.com/questions – SnakeDoc

+2

嘗試在上面的'scp'之前添加'echo',問題可能會跳出來:-) – BRFennPocock

回答

1

上轉儲文件您的循環增加$files這樣的:

files="$files file_$i.dump" 

# $files will look like this when the loop is done: 
" file_1000000.dump file_1100000.dump file_1200000.dump ..." 

現在看看當你使用會發生什麼,與scp

scp [email protected]:/user/ file_1000000.dump file_1100000.dump file_1200000.dump ./ 

這顯然不起作用。

如果您的文件真的在子目錄/user(當然您不是指~user?),您可以使用{}對它們進行分組。他們在你的循環添加到$files這樣的:

files="$files,file_$i.dump" 
# When finished, it will look like this (yes leading ,) 
",file_1000000.dump,file_1100000.dump,file_12000000.dump,..." 

使用bash變量替換刪除前導,

scp [email protected]:/user/{${files#,}} ./ 

如果這種感覺太複雜了現在稱之爲SCP,你不介意額外的轉移 - 時間,也許只是scp循環中的文件,如在其他答案建議...

+0

+1我認爲你打敗了我,認識到路徑不是完整的大約一分鐘,很好的解釋+使用bash替換。 – BroSlow

0

遠程文件路徑中缺少「/ user」。它只在第一個文件路徑中,實際上我不確定可以用這種方式爲scp指定文件。我更喜歡:

for i in `seq -f '%9.0f' 1000000 100000 50500000`; do 
    scp [email protected]:/user/file_$i.dump . 
done 

的情況下,該文件是小有另一種方式,以避免建立連接

ssh [email protected] "cd /user/; tar cf - $(seq -f '%9.0f' 1000000 100000 50500000)" |tar xf - 

它創建tar歸檔文件,並將其寫入被重定向到本地標準輸出的額外開銷機器和另一個tar將文件從stdout寫入文件的位置。如果支持壓縮「z」選項,則可以同時使用tar選項,或者可以將gzip和gunzip添加到管道。

+0

這種方法在這個意義上是不是效率低下每次都必須建立連接時,簿記在服務器端,... –

+1

@CommuSoft是有開銷,但如果文件很大也不是那麼壞 – JosefN

+0

@JosefN感謝您的這兩種方法。我嘗試了第一個,但它一直問我密碼,所以最好先對它們進行tar處理,然後再下載我的例子。 – Leo

1

你必須提供完整路徑scp和你可能有一個報價問題,請嘗試

#!/bin/bash 
files="/user/file_1000000.dump" 
for i in `seq -f '%9.0f' 1100000 100000 50500000`; do 
    files="$files /user/file_$i.dump" 
done 
scp "[email protected]:/$files" ./ 

例如利用一些空輸出觸動另一臺計算機

> ./script 
user password: 
file_1000000.dump        100% 0  0.0KB/s 00:00  
file_1100000.dump        100% 0  0.0KB/s 00:00  
file_1200000.dump        100% 0  0.0KB/s 00:00  
file_1300000.dump        100% 0  0.0KB/s 00:00  
file_1400000.dump        100% 0  0.0KB/s 00:00  
file_1500000.dump        100% 0  0.0KB/s 00:00 
... 
+0

對不起,這不起作用。 '$ files'是由空格分隔的文件名列表,不能以這種方式使用.. – grebneke

+0

@grebneke給出完整的路徑名,它肯定可以(它只是將最後一個參數作爲scp返回的位置)。從scp手冊頁'[[user @] host1:] file1 ... [[user @] host2:] file2' – BroSlow

+0

我站好了。請注意,周圍的「」「'是必要的。 'scp「[email protected]:/ path/to/foo/path/to/bar」。/'有效。 'scp [email protected]:/ path/to/foo/path/to/bar。/'不。 – grebneke