【问题标题】:copy a list of files from remote server从远程服务器复制文件列表
【发布时间】:2022-01-17 11:06:19
【问题描述】:

一般来说,我可以将远程服务器上的文件一个一个地scp到我的本地主机;但是,我想从一个大的远程文件夹中提取200个文件,并且一个一个scp效率不高。我想知道是否有更优雅的方法来实现这一点。 这是我平时做的一件一件的事情: scp remote/Users/folder/file.txt local/Desktop

我创建了一个 .txt 文件,其中包含我想要 scp 的文件名。

任何评论将不胜感激!

【问题讨论】:

  • cat file_name.txt | awk '{ printf "scp user@host_ip:/path/to/folder/%s .", $1}' | bash 你可以用这样的东西
  • rsync 使用--files-from=FILE 将传输FILE 中提供的文件列表。您要传输的文件列表。见man 1 rsync。注意提供远程主机上的相对或绝对文件位置。
  • @AbuHanifa :这将更加低效:它不仅会导致每个文件调用一次scp,还会导致额外的 bash 进程。
  • @DavidC.Rankin :如果您将-z 添加到您的rsync,我认为您的解决方案将是此处讨论的最有效的解决方案。也许值得提供它作为答案。

标签: linux bash remote-server scp


【解决方案1】:

不要使用scp。而是使用ssh 在远程系统上运行tar 以创建存档。在本地系统上运行另一个tar 以提取数据。

ssh user@remote 'tar cf - folder' | tar xf -

或者带有文件列表:

ssh user@remote 'tar cf - -T mylist.txt' | tar xf -

如果你愿意,请添加compression

ssh user@remote 'tar cJf - -T mylist.txt' | tar xJf -

【讨论】:

  • 这不考虑文件列表。它只是传输文件夹的内容。
  • 好点。我从未注意到tar-T 选项。但是据我了解(OP在这方面有点不清楚), mylist.txt 中的文件是相对路径,因此我们需要文件夹和文件列表的某种组合。换句话说:文件列表需要以某种方式“预处理”。请参阅我的答案(与您的相比,使用一种不太优雅的方法),我使用sed 在文件列表中生成正确的路径。
【解决方案2】:

您可以尝试像这样使用 GNU Parallel 并行获取它们:

parallel -a FILELIST.TXT scp remote:{} $HOME/Desktop

性能可能会更好或更差,具体取决于文件大小、本地和远程磁盘子系统以及网络。

一般来说,如果文件很大且内容基本不变,则使用rsync 会做得更好。如果文件非常小,您可能会使用tar 做得更好。如果您的网络“滞后”,您可能会使用parallel 做得更好。如果性能很重要,最好进行衡量和分析。

【讨论】:

    【解决方案3】:

    如果您的 txt 文件包含要传输的文件,是否包含带有空格的文件名,这将在一次调用中传输多个文件:

    sed 's:^:remote/Users/folder/:' filelist.txt | xargs -i -r scp {} target_directory
    

    filelist.txt 是您的文本文件。如果您确实有带空格的文件,则有两种解决方法,具体取决于您的文件列表的生成方式:

    • 如果您手动创建文件列表,请在每个空格前添加 反斜杠,以便 xargs 将整行视为单个文件。

    • 如果您使用程序创建列表,请确保每个文件名都以 null 字节结尾(例如 find -print0 正在执行此操作),并将 -0 选项添加到xargs.

    您可以通过要求xargs 并行使用多个进程来加快处理速度。请参阅选项-P

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 2018-10-06
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多