如何只显示来自aws s3 ls命令的文件?

时间:2016-04-23 16:23:20

标签: linux amazon-web-services amazon-s3 ls aws-cli

我使用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

如何省略日期,时间和文件大小以仅显示文件列表?

10 个答案:

答案 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