我使用aws cli使用以下命令(documentation)列出s3存储桶中的文件:
aws s3 ls s3://mybucket --recursive --human-readable --summarize
此命令为我提供以下输出:
2013-09-02 21:37:53 10 Bytes a.txt
2013-09-02 21:37:53 2.9 MiB foo.zip
2013-09-02 21:32:57 23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58 41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57 281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57 73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57 452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57 896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57 189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57 398 Bytes z.txt
Total Objects: 10
Total Size: 2.9 MiB
然而,这是我想要的输出:
a.txt
foo.zip
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
foo/bar/.baz/d
foo/bar/.baz/e
foo/bar/.baz/hooks/bar
foo/bar/.baz/hooks/foo
z.txt
如何省略日期,时间和文件大小以仅显示文件列表?
答案 0 :(得分:50)
您只能使用aws
命令执行此操作,但您可以轻松地将其传输到另一个命令以去除您不想要的部分。您还需要删除--human-readable
标志以使输出更易于使用,并使用--summarize
标志删除最后的摘要数据。
试试这个:
aws s3 ls s3://mybucket --recursive | awk '{print $4}'
编辑:将文件名中的空格考虑在内:
aws s3 ls s3://mybucket --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'
答案 1 :(得分:7)
一个简单的过滤器是:
aws s3 ls s3://mybucket --recursive | perl -pe 's/^(?:\S+\s+){3}//'
这将删除日期,时间和大小。只留下文件的完整路径。它也可以在没有递归的情况下工作,它也适用于包含空格的文件名。
答案 2 :(得分:4)
将s3api与jq(AWS docu aws s3api list-objects)配合使用:
此模式始终是递归的。
$ aws s3api list-objects --bucket "bucket" | jq -r '.Contents[].Key'
a.txt
foo.zip
foo/bar/.baz/a
[...]
您可以通过添加前缀(此处为foo
目录)来过滤子目录。前缀不能以/
开头。
$ aws s3api list-objects --bucket "bucket" --prefix "foo/" | jq -r '.Contents[].Key'
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
[...]
jq选项:
-r
=原始模式,输出中没有引号.Contents[]
=获取Contents
对象数组内容.Key
=获取每个键字段(不会产生有效的JSON数组,但是我们处于原始模式,因此我们不在乎)附录:
您可以使用纯AWS CLI,但是值将由\x09
=水平制表符(AWS: Controlling Command Output from the AWS CLI - Text Output Format)分隔
$ aws s3api list-objects --bucket "bucket" --prefix "foo/" --query "Contents[].Key" --output text
foo/bar/.baz/a foo/bar/.baz/b foo/bar/.baz/c [...]
AWS CLI选项:
--query "Contents[].Key"
=查询目录对象数组并获取其中的每个键--output text
=输出为制表符分隔的文本,现在带有引号答案 3 :(得分:3)
简单方法
aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
答案 4 :(得分:2)
仅对于文件名称,我发现最简单的是:
aws s3 ls s3://path/to/bucket/ | cut -d " " -f 4
这会在空格(cut -d " "
)处剪切返回的输出,并返回第四列(-f 4
),这是文件名列表。
答案 5 :(得分:1)
简单的命令就是
aws s3 ls s3://mybucket --recursive --human-readable --summarize |cut -d ' ' -f 8
如果您需要时间戳,只需更新命令字段值。
答案 6 :(得分:1)
我的解决方案
仅使用aws cli递归列出文件。
aws s3 ls s3://myBucket --recursive | awk 'NF>1{print $4}' | grep .
grep .
-清除空行。
示例:aws s3 ls s3://myBucket
PRE f5c10c1678e8484482964b8fdcfe43ad/
PRE f65b94ad31734135a61a7fb932f7054d/
PRE f79b12a226b542dbb373c502bf125ffb/
PRE logos/
PRE test/
PRE userpics/
2019-05-14 10:56:28 7754 stage.js
解决方案:aws s3 ls s3://myBucket --recursive | awk 'NF>1{print $4}' | grep .
stage.js
答案 7 :(得分:1)
S3存储桶不仅可以包含文件,而且可以包含带前缀的文件。如果您使用aws s3 ls s3://$S3_BUCKET/$S3_OPTIONAL_PREFIX/ --recursive | awk '{ if($3 >0) print $4}'
,则它不仅会列出文件,还会列出前缀。如果您不关心前缀,而只关心存储桶中的文件或存储桶中的前缀,则应该可以。
awk
$3
的{{1}}是文件大小(如果有前缀,则为0
)。也可能是文件为空,因此也会跳过空文件。
答案 8 :(得分:1)
我建议不要依赖于间距和获取第四个字段。
从技术上讲,无论其处于哪个位置,您都希望最后一个字段。
因此,rev
的使用会更安全...
rev
通过char反转字符串输入char
因此,当将aws s3 ls
输出到rev
时,您会颠倒所有内容,包括字段的位置,因此最后一个字段始终成为第一个字段。
不必弄清楚最后一个字段在哪里,您只需rev
,先获取,然后再rev
,因为该字段中的字符也将相反。 (例如2013-09-02 21:32:57 23 Bytes foo/bar/.baz/a
变成a/zab./rab/oof setyB 32 75:23:12 20-90-3102
)
然后cut -d" "
-f1 would retrieve the first field
a / zab。/ rab / oof <br> then
rev again to get
foo / bar / .baz / a`
aws s3 ls s3://mybucket --recursive | rev | cut -d" " -f1 | rev
答案 9 :(得分:1)
How to display only files from aws s3 ls command?
1. Basic command
$ aws s3 ls s3://bucket --recursive
output :
2021-02-10 15:29:02 0 documents/
2021-02-10 15:29:02 18 documents/data/data.txt
2021-03-15 23:35:12 0 documents/data/my code.txt
2. To get only keys from s3 bucket containing spaces also.
$ aws s3 ls s3://bucket --recursive | awk '{ $1=$2=$3=""; print $0}' | cut -c4-
output :
documents/
documents/data/data.txt
documents/data/my code.txt
3. Removing "documents/" from result
$ aws s3 ls s3://bucket --recursive | awk '$0 !~ /\/$/ { $1=$2=$3=""; print $0}' | cut -c4-
output :
documents/data/data.txt
documents/data/my code.txt