【问题标题】:Errno 22 When downloading multiple files from S3 bucket "sub-folder"Errno 22 从 S3 存储桶“子文件夹”下载多个文件时
【发布时间】:2021-09-03 11:03:31
【问题描述】:

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

我正在使用以下命令;

aws s3 cp s3://my_bucket/sub_folder /tmp/ --recursive

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

[Errno 22] Invalid argument: 'C:\\tmp\\2019-08-15T16:15:02.tif.deDBF2C2

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

有人知道这是什么原因吗?

更新:一旦我从 linux 机器上执行该命令,该命令就起作用了。似乎是特定于 windows 的。

【问题讨论】:

  • 试试这个而不是 /tmp` 会破坏路径 aws s3 cp s3://my_bucket/sub_folder . --recursive
  • 我仍然遇到同样的错误
  • 尝试从其他驱动器运行命令然后C
  • 我只有C盘

标签: amazon-web-services amazon-s3 command-line-interface


【解决方案1】:

这是 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

输出文件充满了这些 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 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。 >

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

然后您将看到以下带有命令的行:aws s3 cp、Bucket 文件和本地文件路径。我们需要去掉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

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

在这里我们可以看到我已经用连字符 $1- 替换了 ::'s,方法是点击两次“全部替换”:

接下来移除 to(忽略下图中的 | 光标图标,to 应替换为空)。
查找:json.gz to AWSLogs
替换:json.gz AWSLogs

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

更新:

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

【讨论】:

    【解决方案2】:

    我用我的树莓派试过了,它奏效了。似乎只是 Windows 操作系统的问题。

    【讨论】:

    • : 字符在 Windows 中是保留的。
    猜你喜欢
    • 2015-05-20
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2017-02-16
    • 2013-10-15
    • 2019-09-06
    相关资源
    最近更新 更多