【问题标题】:gsutil rsync only files matching a patterngsutil rsync 仅匹配模式的文件
【发布时间】:2019-02-22 03:09:23
【问题描述】:

我需要每天将存储桶中的文件同步到本地机器,存储桶包含 20k 个文件。我需要下载以 *some_naming_convention.csv 结尾的已更改文件。 最好的方法是什么?在下载源中使用通配符给我一个错误。

【问题讨论】:

  • -x option 允许您指定要从复制/删除操作中排除的模式。这是否适合您的需求?
  • 有各种我不知道的文件名。我只需要下载特定的文件:/

标签: gsutil


【解决方案1】:

我认为你不能用 Rsynch 做到这一点。正如 Christopher 告诉您的,您可以使用“-x”标志跳过文件,但不能只同步那些 [1]。我代表您创建了一个公开功能请求[2],以便您在那里关注更新。

正如我在 FR 中所说,恕我直言,我认为这不符合 rsynch 的目的,因为它是为了保持文件夹/存储桶同步,并且仅同步其中一些不属于该目的。

通过使用gsutil cp 复制文件和使用-n 跳过已经存在的文件,有一个可能的“解决方法”。您的案例的整个命令应该是:

gsutil -m cp -n <bucket>/*some_naming_convention.csv <directory>

其他选项,也许有点牵强是将这些文件复制/移动到一个文件夹,然后使用该文件夹进行 rsynch。

我希望这对你有用;)

【讨论】:

  • 感谢功能请求!!不幸的是似乎没有受到太多关注:-(
【解决方案2】:

here,您可以执行类似gsutil rsync -r -x '^(?!.*\.json$).*' gs://mybucket mydir 的操作来同步所有 json 文件。关键是您真正想要的模式的 ?! 前缀。

【讨论】:

    【解决方案3】:

    Rsync 允许您包含和排除匹配模式的文件。

    对于每个文件,rsync 应用第一个匹配的补丁,如果您只想同步选定的文件,则需要包含这些文件,然后排除其他所有文件。

    将以下内容添加到您的 rsync 选项中:

    --include='*some_naming_convention.csv' --exclude='*'
    

    如果您的所有文件都在一个目录中,这就足够了。如果您还想搜索子文件夹,那么您需要更多:

    --include='*/' --include='*some_naming_convention.csv' --exclude='*'
    

    这将复制所有目录树,但只复制您想要的文件。如果留下您不想要的空目录,请添加--prune-empty-dirs

    【讨论】:

    • 这是否包括 gsutil 的 rsync 版本?
    • 我不知道。如果那不是真正的 rsync,那么您应该删除 rsync 标记。
    • 我想说rsync 标签是合适的,它只是一个不同的rsync 风格。例如,使用 mac 的人会发布有关 sedgrep 的问题,即使它们具有不同的 API 和功能;没有人抱怨在这些情况下使用标签。
    猜你喜欢
    • 2019-11-06
    • 2021-07-13
    • 2021-11-05
    • 2020-05-16
    • 2020-01-24
    • 2020-03-20
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多