簡體   English   中英

使用 ssh、find 和 rsync 從遠程主機拉取大量文件

[英]Pulling a lot of files from a remote host using ssh, find, and rsync

我正在嘗試集成以下命令以從遠程主機中提取大量文件,而不發送重復文件

for FILE in $(ssh $FTP_USER@$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 $FTP_USER@$FTP_HOST:$FILE $LOCAL_DIR
done

但是,它似乎在 FOR LOOP 的每次迭代都連接到 FTP_HOST。 有沒有辦法連接一次,將 FIND 命令的所有結果拉到一個數組中,然后在該數組中循環 rsync?

這是我執行此操作的復雜命令:

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

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

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

為了遠程運行它,我們使用以下技巧:

ssh "$FTP_USER@$FTP_HOST" $(printf '%q ' ......)

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

最后,我們將文件名列表通過管道傳輸到rsync 我們使用-0 --files-from=-告訴rsync從其標准輸入讀取文件列表,並將其視為空分隔列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM