如何使用 aws cli 命令仅显示 s3 存储桶中的目录

问题描述 投票:0回答:5

我需要显示 s3 存储桶中存在的所有目录,其中一些目录是隐藏的,只有当我将版本过滤为“显示”而不是隐藏时才会再次显示。

同样的事情也适用于目录内我们看不到文件的文件,但是当我们选择版本中的过滤器为“显示”时,它会显示文件。

我们如何在aws-cli中看到这些文件和目录。如果您有解决方案,请帮忙。


例如:

roxor@ubuntu:~$ aws s3 ls s3://dw-etl-source-prod
workday dsr

我需要获取 4 个目录,但由于这些目录包含版本控制,因此未显示。如果我筛选版本以显示它会提供 aws s3 UI 中的所有文件,但我如何使用 AWS CLI 执行相同操作。

bash amazon-web-services amazon-s3 devops aws-cli
5个回答
7
投票

如果您使用的是基于 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 个字符。如果您的文件太大,您可能需要调整此设置。


1
投票

我的解决方案:

aws s3 ls://<your bucket>/<path>/<to>/ | awk '{print $2}'

1
投票

我将其中一些解决方案组合成一个简单的单行程序,该行程序通过检查目录中的任何内容(但不是递归地)来工作,该目录也是一个目录(文件名以 / 结尾的任何内容)

aws s3 ls s3://<your bucket>/<path>/<to>/ | awk '{print $2}' | awk -F '/' '/\// {print $1}'

希望这有帮助!


0
投票

你可以尝试一下。

aws s3 ls s3://<bucket-name> --recursive --human-readable --summarize | awk '{print $5}' | awk -F '/' '/\// {print $1}' | sort -u

0
投票

首先,关于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
© www.soinside.com 2019 - 2024. All rights reserved.