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

Bor*_*lis 42 linux ls amazon-s3 amazon-web-services aws-cli

我使用aws cli使用以下命令(文档)列出s3存储桶中的文件:

aws s3 ls s3://mybucket --recursive --human-readable --summarize
Run Code Online (Sandbox Code Playgroud)

这个命令给我以下输出:

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
Run Code Online (Sandbox Code Playgroud)

但是,这是我想要的输出:

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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*k B 61

您不能仅使用该aws命令执行此操作,但您可以轻松地将其传递给另一个命令以去除您不想要的部分.您还需要删除--human-readable标志以使输出更容易使用,并--summarize在最后删除标记以删除摘要数据.

试试这个:

aws s3 ls s3://mybucket --recursive | awk '{print $4}'
Run Code Online (Sandbox Code Playgroud)

编辑:将文件名中的空格考虑在内:

aws s3 ls s3://mybucket --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'
Run Code Online (Sandbox Code Playgroud)

  • @MichalGasek如果你像我指定的那样删除`--human-readable`标志,那么它是$ 4,而不是$ 5. (4认同)
  • 不要认为真的值得另一个答案.通过perl管道并在第3个空格之后进行匹配可以在这里正常工作:`aws s3 ls s3:// mybucket --recursive | perl -ne'($ key)= $ _ =〜/ ^ [\ d\ - ] +\s + [\ d \:] +\s +\d +\s(.+?)$/g; 打印"$ key \n";'` (3认同)
  • 备用非awk解决方案:`aws s3 ls s3:// mybucket --recursive | tr -s''| 切-d''-f4` (3认同)
  • 我无法验证这是否适用于递归,但由于“简单”版本不适用于文件名中的空格,因此它似乎是一个脆弱的解决方案,而另一个则不必要地复杂。相反,剪切字符,这应该足够强大,直到 CLI 输出格式更改:`aws s3 ls s3://mybucket | cut -c32-` (可选地添加递归并验证它仍然有效) (2认同)

小智 7

一个简单的过滤器将是:

aws s3 ls s3://mybucket --recursive | perl -pe 's/^(?:\S+\s+){3}//'
Run Code Online (Sandbox Code Playgroud)

这将删除日期,时间和大小.只留下文件的完整路径.它也可以在没有递归的情况下工作,它也应该与包含空格的文件名一起使用.


not*_*-jj 7

将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
[...]
Run Code Online (Sandbox Code Playgroud)

您可以通过添加前缀(此处为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
[...]
Run Code Online (Sandbox Code Playgroud)

jq选项:

  • -r =原始模式,输出中无引号
  • .Contents[]=获取Contents对象数组内容
  • .Key =获取每个键字段(不会产生有效的JSON数组,但是我们处于原始模式,因此我们不在乎)

附录

您可以使用纯AWS CLI,但值将由\x09= Horizo​​ntal Tab 分隔(AWS:从AWS CLI控制命令输出-文本输出格式

$ 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   [...]
Run Code Online (Sandbox Code Playgroud)

AWS CLI选项:

  • --query "Contents[].Key" =查询目录对象数组并获取其中的每个键
  • --output text =输出为制表符分隔的文本,现在带有引号

  • 我喜欢纯 AWS CLI,实际上您可以使用 `--query 'Contents[].{Key: Key}'` 来完成。然后每行一条记录。 (3认同)
  • 非常好。或`aws s3api list-buckets | jq -r '.Buckets[].Name'` (2认同)

Tec*_*ort 5

简单的方法

aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
Run Code Online (Sandbox Code Playgroud)