【问题标题】:Pulling a lot of files from a remote host using ssh, find, and rsync使用 ssh、find 和 rsync 从远程主机提取大量文件
【发布时间】:2016-09-27 12:12:37
【问题描述】:

我正在尝试集成以下命令以从远程主机中提取大量文件,而不发送重复文件

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 循环的每次迭代似乎都连接到 FTP_HOST。有没有办法连接一次,将 FIND 命令的所有结果拉到一个数组中,然后在该数组中循环 rsync?

【问题讨论】:

    标签: bash shell unix rsync


    【解决方案1】:

    这是我的复杂命令:

    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 从其标准输入中读取文件列表,并且它应该将其视为一个空分隔列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2018-03-23
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多