Errno 22 从 S3 存储桶“子文件夹”下载多个文件时

Ozy*_*ias 8 command-line-interface amazon-s3 amazon-web-services

我一直在尝试使用 AWS CLI 从 AWS 中的子文件夹下载所有文件,但是,在下载前几个文件后,它无法下载其余文件。我相信这是因为它为文件名添加了扩展名,然后将其视为无效的文件路径。

我正在使用以下命令;

aws s3 cp s3://my_bucket/sub_folder /tmp/ --recursive
Run Code Online (Sandbox Code Playgroud)

对于子文件夹中的几乎所有文件,它给了我以下错误;

[Errno 22] Invalid argument: 'C:\\tmp\\2019-08-15T16:15:02.tif.deDBF2C2
Run Code Online (Sandbox Code Playgroud)

我认为这是因为 .deDBF2C2 扩展名似乎在下载时添加到文件中,但我不知道为什么会这样。文件名在实际存储桶中都以 .tif 结尾。

有谁知道是什么原因造成的?

更新:该命令在我从 linux 机器上执行后就起作用了。似乎特定于Windows。

Jer*_*son 12

这是AWS 在日志文件名称中使用 Windows 保留字符的疏忽!当您执行该命令时,它将创建所有目录,但是::名称中包含的任何日志都无法下载。

此处讨论问题:https ://github.com/aws/aws-cli/issues/4543

非常沮丧,我想出了一个解决方法,通过执行“DryRun”来打印预期的日志输出并将其移植到文本文件,例如:

>aws s3 cp s3://config-bucket-7XXXXXXXXXXX3 c:\temp --recursive --dryrun > c:\temp\aScriptToDownloadFilesAndReplaceNames.txt
Run Code Online (Sandbox Code Playgroud)

输出文件充满了这些aws 日志条目,我们可以将其转换为 aws 脚本命令

(试运行)下载:s3://config-bucket-7XXXXXXXXXXX3/AWSLogs/7XXXXXXXXXXX3/Config/ap-southeast-2/2019/10/1/ConfigHistory/7XXXXXXXXXXX3_Config_ap-southeast-2_ConfigHistory_AWS::RDS::DBInstance_20191001T103223Z_20191001T103223Z _1.json.gz \AWSLogs\7XXXXXXXXXXX3\Config\ap-southeast-2\2019\10\1\ConfigHistory\703014955993_Config_ap-southeast-2_ConfigHistory_AWS::RDS::DBInstance_20191001T103223Z_20191001T103223Z_1.json.gz

在 Notepad++ 或其他文本编辑器中,将其替换(dryrun) download:aws s3 cp

在此输入图像描述

然后您将看到以下几行命令:aws s3 cp、存储桶文件和本地文件路径。我们需要删除to右侧本地文件路径中的:::

aws s3 cp s3://config-bucket-7XXXXXXXXXXX3/AWSLogs/7XXXXXXXXXXX3/Config/ap-southeast-2/2019/10/1/ConfigHistory/7XXXXXXXXXXX3_Config_ap-southeast-2_ConfigHistory_AWS::RDS::DBInstance_20191001T103223Z_20191001T103223Z_1.json.gz to AWSLogs\7XXXXXXXXXXX3\Config\ap-southeast-2\2019\10\1\ConfigHistory\7XXXXXXXXXXX3_Config_ap-southeast-2_ConfigHistory_AWS::RDS::DBInstance_20191001T103223Z_20191001T103223Z_1.json.gz
Run Code Online (Sandbox Code Playgroud)

我们可以使用正则表达式将::替换为-仅在本地路径而不是 S3 Bucket 路径中(.*)::,该正则表达式删除每行末尾最后出现的字符:

在此输入图像描述$1-在这里我们可以看到我通过单击“全部替换”两次 将 :: 替换为连字符:

在此输入图像描述

接下来删除to(忽略下图中的 | 光标图标,to应该替换为任何内容)。
查找:json.gz to AWSLogs
替换:json.gz AWSLogs

在此输入图像描述

最后选择所有行复制/粘贴到命令提示符中以下载带有保留文件字符的所有文件!

更新:

如果您有 WSL(Windows 子系统 Linux),您应该能够下载文件,然后在复制到安装的 Windows 文件夹系统之前发出简单的文件重命名替换 :: 。