我需要显示 s3 存储桶中存在的所有目录,其中一些目录是隐藏的,只有当我将版本过滤为“显示”而不是隐藏时才会再次显示。
同样的事情也适用于目录内我们看不到文件的文件,但是当我们选择版本中的过滤器为“显示”时,它会显示文件。
我们如何在aws-cli中看到这些文件和目录。如果您有解决方案,请帮忙。
例如:
roxor@ubuntu:~$ aws s3 ls s3://dw-etl-source-prod
workday dsr
我需要获取 4 个目录,但由于这些目录包含版本控制,因此未显示。如果我筛选版本以显示它会提供 aws s3 UI 中的所有文件,但我如何使用 AWS CLI 执行相同操作。
如果您使用的是基于 POSIX 的系统并且想要使用熟悉的
aws s3 ls
语法,请尝试:
aws s3 ls --recursive <s3Uri> | cut -c32- | xargs -d '\n' -n 1 dirname | uniq
这是一个快速解释。截至 2020 年 11 月,
aws s3 ls
按以下格式打印对象:
<date> <time> <size> <path>
的想法是使用
<path>
从此列表中提取 cut
,将其传递给 dirname
以提取目录名称,最后使用 uniq
以避免重复。 cut -c32-
将 s3 列表修剪到第 31 个字符。如果您的文件太大,您可能需要调整此设置。
我的解决方案:
aws s3 ls://<your bucket>/<path>/<to>/ | awk '{print $2}'
我将其中一些解决方案组合成一个简单的单行程序,该行程序通过检查目录中的任何内容(但不是递归地)来工作,该目录也是一个目录(文件名以 / 结尾的任何内容)
aws s3 ls s3://<your bucket>/<path>/<to>/ | awk '{print $2}' | awk -F '/' '/\// {print $1}'
希望这有帮助!
你可以尝试一下。
aws s3 ls s3://<bucket-name> --recursive --human-readable --summarize | awk '{print $5}' | awk -F '/' '/\// {print $1}' | sort -u
首先,关于OP问题,我认为
aws s3 ls
不能显示版本化对象。我知道的唯一方法是使用类似的东西
aws s3api list-object-versions --bucket <bucket-name> [--output text|json]
如果使用 json 输出,你可以使用一些
jq
黑客来获得你想要的输出。
但正如许多人从搜索引擎来到这里,寻找一种方法来递归地显示 s3 的对象,en
对于 MacOS 用户或者如果您不想使用“tr ...|xargs -0”
@nikhiwee 的解决方案对我不起作用(
xargs -d
在不安装 gnu 版本的情况下在 MacOS 上不存在),所以想出了一个仅使用 awk + sort 的选项
截至 2023 年 10 月
aws s3 ls --recursive <s3Uri>
仍然输出:
<date> <time> <size> <object-name>
所以这个解决方案对我有用
aws s3 ls --recursive <s3Uri> | awk '{ sub( /\/.[^\/]*$/,"/",$4 ); print $4}' | sort -u