将数十万个文件从远程目录复制到另一个远程目录

将数十万个文件从远程目录复制到另一个远程目录

我有一个远程目录(启用 SSH)11.11.11.11/:/path/from我在(Ubuntu 机器)百万微小的.txt小文件,执行简单的ls命令,甚至打开/path/from/使用 WinSCP 打开目录是不可能的,因为有百万 文件数量。

我的目标是找到数千个具有特定名称模式的文件将它们复制到另一个远程位置(例如22.22.22.22:/path/to)。

这是我到目前为止所尝试过的:

scp --exec=`find /path/from -name 'A*random*' -mtime +0 -mtime -10` [email protected]:/path/to

但这需要很长很长的时间才能做到这一点,就像我所说的/path/from/目录实际上包含数百万个文件。

您有让它更快的建议吗?使用rsync?我该怎么做呢?我怎样才能将find结果限制为某个数字,比如说1000,因为我只知道如何使用最后修改日期 来限制它-mtime

答案1

也许您可以find结合使用cpio,从一台计算机上的许多文件创建流,并在cpio另一台计算机上提取文件。

ssh user@source "cd sourcedir && find ./ -xdev -name 'A*random*' -print | cpio -o -Bav -H crc" | ssh user@target "cd destinationdir && cpio -i -vumd"

这个(未经测试的)解决方案基于https://www.netroby.com/view/3602。在那里您将找到关于find和 的参数的一些解释cpio

答案2

尝试locate

对于这个应用程序来说似乎find太慢了。

  • 有一个更快的工具来查找文件,locate。它使用一个数据库,必须更新该数据库才能locate找到最新的文件。

  • updatedb创建或更新 所使用的数据库locate。如果数据库已经存在,则重用其数据以避免重新读取未更改的目录。

    find这个更新过程与数据库更新时会找到所有文件相比非常快locate(并且比 快得多find)。

用法

  • 创造和下一次更新数据库

    sudo updatedb
    
  • 寻找相关文件。locate提供了几个有用的选项,但没有像find.您也许可以设计一个有用的模式为了您的目的。

    我建议您使用两个命令行,您可以修改它们,然后与scp或结合使用rsync

    您可以限制文件数量--limit

    如果您仅在/path/from/子目录中搜索而不在子目录中搜索

    locate --regex --limit 1000 '/path/from/A.*random.*'
    

    /path/from/如果您不是在其本身而是在其子目录中搜索

    locate --regex --limit 1000 '/path/from/.*/A.*random.*'
    

    请参阅man locate了解更多详情。

普通的留言

  • 也许您应该修改这些文件的写入和存储方式,例如使用多个子目录,以便每个目录中没有太多文件,例如每个日期一个子目录(2019-02-122019-02-13...),

    甚至更好,就像许多照片管理器存储图片文件一样,

    • 每年一层子目录
    • 一年中每个月的下一级子目录
    • 每月每一天的最后一级子目录,用于存储文件。
  • 也许您还可以删除一些文件(例如当它们变得太旧时)。

答案3

  1. tar、zip 或将文件夹下的所有内容压缩到一个source.tar文件中;可以快速做via tar -cf /sourcedirectory;然而,这将很大,现在在一个文件中包含所有 100,000 多个文件。
  2. 按照您喜欢的方式传输此文件
  3. 到达目的地后,tar -xf source.tar或适当解压缩/解压缩回包含 100,000 多个文件的原始文件夹结构。

相关内容