2013-07-12 42 views
1

我試圖獲取SCP從一臺服務器複製到另一臺服務器的文件列表,但該命令似乎沒有在read循環中正確構建。在讀取循環中構建SCP命令語法時出錯

我有一個名爲diff_tapes.txt文件,其中包含如下要複製的文件列表:

/VAULT14/TEST_V14/634001 
/VAULT14/TEST_V14/634002 
/VAULT14/TEST_V14/634003 
/VAULT14/TEST_V14/634004 

等等...

我使用bash命令行如下:

while read line; do scp -p [email protected]:$line $line;done < /home/bill/diff_tapes.txt 

當我執行該命令行(我在CentOS所以基本上紅帽運行),我得到:

/VAULT14/TEST_V14/634001: No such file or directory 

...對於每個單個文件。

如果我再跑加入-v開關,以獲得更多的信息,我看到以下內容:

debug1: Sending command: scp -v -p -f /VAULT14/TEST_V14/634001 

遠程服務器(lgrdcpvtsa)絕對有問題的文件:

[[email protected] TEST_V14]$ pwd 
/VAULT14/TEST_V14 
[[email protected] TEST_V14]$ ls -ll 
total 207200 
-rw------- 1 bill bill 27263700 Apr 26 11:16 634001 
-rw------- 1 bill bill 27263700 Apr 26 11:16 634002 
-rw------- 1 bill bill 27263700 Apr 26 11:16 634003 
-rw------- 1 bill bill 27263700 Apr 26 11:16 634004 

這是就好像我第二次在scp命令中有$line一樣,它被忽略了。

任何想法有什麼問題的語法?

編輯:

爲了清楚起見,文件列表是更可能是這樣的:

/VAULT14/634100_V14/634001 
/VAULT11/601100_V11/601011 
/VAULT12/510200_V12/510192 

而且/VAULT10通過/VAULT14都存在服務器上,它只是一個文件夾節點可能不。

這些文件是在本地和遠程計算機上標記爲不同的文件,因此從遠程計算機複製是正確的數據源,所以遞歸複製在這裏不起作用(我認爲-r交換機是從一個較早的測試,所以我已經從上面的代碼中刪除)。

+0

有沒有辦法在運行時創建的目錄?如果不是,我想我需要首先解析文件列表以獲取目錄並創建它們是否不在本地,然後運行此操作,如果我可以在一個命令中執行操作,那麼將會很好。 –

回答

1

該錯誤可能是由於本地目錄/VAULT14/TEST_V14/不存在。

可以使用dirname命令從路徑中獲取目錄名稱,創建目錄,然後執行scp命令。例如

while read line; do mkdir -p "$(dirname "$line")"; scp -rp [email protected]:"$line" "$line";done < /home/bill/diff_tapes.txt 

-p選項告訴mkdir創建子目錄即使父不存在。

編輯: 這是所有文件複製到/於是紛紛改變其正常使用的情況如下:

while read line; do mkdir -p "$(dirname "$line")"; scp -p [email protected]:"$line" "$line";done < /home/bill/diff_tapes.txt 
+0

T hank,之前我沒有遇到'dirname'命令,真的很有用:-) –

1

/VAULT14/TEST_V14/634001:沒有這樣的文件或目錄

這可能是因爲該文件夾/VAULT14/TEST_V14/不會在本地計算機上存在。

結果:

mkdir /VAULT14/TEST14 
while read line; do 
    scp -p [email protected]:"$line" "$line" 
done < /home/bill/diff_tapes.txt 
+0

這不起作用,在我的例子中,這些文件是連續的,並且在相同的目錄中,但是在那裏運行會有大量文件格式爲'/ VAULT1n/nnnnnn_V1n/nnnnnn',因爲文件將是這兩個服務器上的文件列表不一致(本地計算機上不存在或本地計算機副本不與遠程副本保持同步)。這個列表是由diff over ssh生成的(我不能使用'rsync',因爲它處理稀疏文件,即使'-S'設置不如'scp') –

+1

那麼,爲什麼你使用'scp- r'?順便說一句,我無法想象,rsync不會做這項工作 – hek2mgl

+0

'-r'是一個切換和早期測試,現在已經刪除了。 'rsync'的問題是,當使用它複製文件時,一旦複製它們的規定大小是瘋狂不正確的,就像它們是稀疏文件一樣(遠程計算機上的200MB文件在本地計算機上報告爲3GB,甚至使用' -S'開關它仍然不準確,只是沒有那麼多!它拋棄了'df'結果,這將會使操作員感到困惑。 –