gsutil 重命名文件,因为它们是从不同目录复制的

Posted

技术标签:

【中文标题】gsutil 重命名文件,因为它们是从不同目录复制的【英文标题】:gsutil rename files as they are being copied from different directories 【发布时间】:2018-08-04 00:02:11 【问题描述】:

我在一个存储桶中有三个文件夹,每个文件夹都包含test_result_0.xml

gs://test-lab-12345-67890/2018-02-23_18:48:45.403202_urtc/Nexus6P-27-en_US-portrait/test_result_0.xml gs://test-lab-12345-67890/2018-02-23_18:48:45.403202_urtc/Nexus7-21-en_US-portrait/test_result_0.xml gs://test-lab-12345-67890/2018-02-23_18:48:45.403202_urtc/Nexus6P-23-en_US-portrait/test_result_0.xml

现在我希望将它们复制到本地文件夹中,并将它们重命名为:

test_result_0.xml

test_result_1.xml

test_result_2.xml

使用 bash 脚本最好的方法是什么?到目前为止我有这个,但它不起作用:(

for i in $("`gsutil ls gs://test-lab-12345-67890 | tail -1`*/*.xml"); do gsutil -m cp -r -U $i ~/Documents done

【问题讨论】:

一些观察。首先,消息顶部列出的路径都是相同的。其次,在 $("...") 构造中,shell 将构造 "..." 字符串,然后尝试执行它。也许从一个 gsutil cp -r 开始到本地目录并在本地进行重命名。 谢谢 - 我明白了,我会发布答案 【参考方案1】:

我尝试使用AWK 改进您的解决方案。 看看你是否更喜欢这种解决方案,不知道你是否认为它更“优雅”:

gsutil ls -r gs://test-lab-12345-67890/**/test_result_* | awk -F"/" 'system("gsutil cp "$0" ~/localpath/"$6)'

在我的测试环境中,使用类似于您的文件和文件夹结构。

P.S.我没有使用您在解决方案中使用的许多 gsutils 标志来提高可读性,但如果您认为需要,可以添加它们。

【讨论】:

【参考方案2】:

用这样的方法解决它:

counter=0
for path in $(gsutil ls -r gs://test-lab-12345-67890/**/*.xml | tail -3); do
	counter=$((counter+1))
	gsutil -m cp -r -U $path ~/localpath
	mv ~/localpath/test_result_0.xml ~/localpath/test_result_$counter.xml
done

不是最漂亮的代码,但它现在可以工作.. 除非有人可以为我提供更好的方法吗? :)

编辑:原来在文档中(我错过了)你可以指定:

--results-bucket=RESULTS_BUCKET] --results-dir=RESULTS_DIR

这样就完全缓解了我遇到的问题,因为我现在可以提前指定文件夹名称了!!我会保留旧代码以供参考。

https://cloud.google.com/sdk/gcloud/reference/alpha/firebase/test/android/run

【讨论】:

以上是关于gsutil 重命名文件,因为它们是从不同目录复制的的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中以编程方式复制、重命名和粘贴文件的最佳方法

多次复制文件夹及其内容,然后重命名它们

批量重命名具有不同扩展名Linux脚本的多个文件?

在linux下复制文件到另外一个目录并且重命名的具体操作如何?

使用 gsutil 复制文件后,它们不会立即从本地存储中删除

如何使用 CopyWebpackPlugin 复制和重命名文件