管道 gsutil 输出到文件

Posted

技术标签:

【中文标题】管道 gsutil 输出到文件【英文标题】:Pipe gsutil output to file 【发布时间】:2013-05-25 07:02:29 【问题描述】:

问候 ***,

我正在 Windows 上做一个小项目,它需要读取 GSUTIL 的复制功能的输出。问题是,复制功能的输出似乎无法通过标准输出工作。此外,GSUTIL 的行为不一致:管道输出不适用于复制功能,但使用列表功能有效。

当我在命令提示符中使用以下命令时,输出会显示在命令提示符中,但不会重定向到文本文件。此命令无法正常工作:

C:\gsutil> python gsutil cp "file://C:/test_files/*" gs://gs_teststore/ > gsutil_cp.txt

另一方面,当我使用列表函数 (ls) 时,输出确实通过标准输出工作,并且在我希望的情况下工作:

C:\gsutil> python gsutil ls gs://gs_teststore/ > gsutil_ls.txt

有没有办法从 GSUTIL 的复制功能中捕获输出?

【问题讨论】:

您是否尝试过使用 2>&1 将标准错误添加到标准输出或 2> 在某处通过管道传递标准错误? support.microsoft.com/kb/110930 【参考方案1】:

杰夫关于使用 gsutil cp -L 的回答是您尝试做的正确解决方案。

只是补充一些关于为什么您无法按预期方式捕获 gsutil cp 输出的详细信息:gsutil 将状态消息输出到 stderr,并且仅当相关输出是命令的目的时才输出到 stdout你在跑。因此,例如,gsutil ls 输出到 stdout,因为该输出是该命令的目的,而相比之下,gsutil cp 命令的进度指示器消息实际上是有关基本目的(即复制数据)的状态——因此输出到标准错误。

Mike Schwartz,Google 云存储团队

【讨论】:

感谢您的澄清,这更有意义。我现在确切地知道我需要做什么。感谢您的帮助。【参考方案2】:

您可以使用 -L 选项生成所有已复制文件的清单文件。来自the documentation:

-L 输出清单日志文件,其中包含有关已复制的每个项目的详细信息。此清单包含以下内容 每个项目的信息:

源路径。 目标路径。 源大小。 传输的字节数。 MD5 哈希值。 UTC 日期和时间传输以 ISO 8601 格式开始。 UTC 日期和时间传输以 ISO 8601 格式完成。 上传 ID,如果执行了可恢复上传。 尝试上传的最终结果,成功或失败。 失败详情(如果有)。

一个具体的例子:

$ echo "hey" | gsutil cp -L manifest.txt - gs://mybucket/hey.txt
Copying from <STDIN> [Content-Type=application/octet-stream]...

$ cat manifest.txt 
Source,Destination,Start,End,Md5,UploadId,Source Size,Bytes Transferred,Result,Description
file://-,gs://mybucket/hey.txt,2013-05-29T21:29:31.847715Z,2013-05-29T21:29:32.115624Z,081ecc5e6dd6ba0d150fc4bc0e62ec50,,,0,OK,

【讨论】:

这比我尝试的要好得多。感谢您的帮助,这个答案将完美解决我的问题。

以上是关于管道 gsutil 输出到文件的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 gsutil 命令执行 shell 脚本吗

crontab gsutil 命令执行但没有输出

在单独的步骤中执行时找不到 gsutil 命令 - bitbucket 管道

通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题

gsutil cp 管道在 docker 容器中作为 bash exec 命令失败

gsutil 将特定扩展文件上传到 gcp gcs