2016-09-27 25 views
2

我試圖整合以下命令來拉了很多文件從遠程主機,不發送重複的文件使用ssh,找到拉了很多文件從遠程主機和rsync

for FILE in $(ssh [email protected]$FTP_HOST find $REMOTE_DIR -maxdepth 1 -name "*$FILEGROUP*.dat.gz" -mmin -30); 
do 
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] + Transferring (ignore-existing): $FILE" 
    rsync -a --ignore-existing [email protected]$FTP_HOST:$FILE $LOCAL_DIR 
done 

然而,它似乎連接到FOR_OPOP的每一次迭代的FTP_HOST。是否有連接一次的方法,將FIND命令的所有結果拉入數組,然後通過該數組循環rsync?

回答

1

這裏是我的複雜的命令,做的是:

ssh "[email protected]$FTP_HOST" \ 
    $(printf '%q ' \ 
     find "$REMOTE_DIR" -maxdepth 1 -type f -name "*$FILEGROUP*.dat.gz" -mmin -30 -printf '%P\0' \ 
    ) | 
rsync -avh0 --files-from=- "[email protected]$FTP_HOST":"$REMOTE_DIR" "$LOCAL_DIR" 

說明:我們要在遠程端運行以下命令,生成的所有文件的相對路徑的空分隔列表我們要複製:

find "$REMOTE_DIR" -maxdepth 1 -type f -name "*$FILEGROUP*.dat.gz" -mmin -30 -printf '%P\0' 

爲了遠程運行它,我們使用下面的技巧:

ssh "[email protected]$FTP_HOST" $(printf '%q ' ......) 

確保所有參數都正確轉義,以便它們不被ssh將調用的遠程shell解釋。

最後,我們將文件名列表管理爲rsync。我們使用-0 --files-from=-來告訴rsync從它的標準輸入中讀取文件列表,並且應該將它作爲空分隔列表處理。