How to display only files from aws s3 ls command?
Use the s3api with jq (AWS docu aws s3api list-objects):
This mode is always recursive.
$ aws s3api list-objects --bucket "bucket" | jq -r '.Contents[].Key'
a.txt
foo.zip
foo/bar/.baz/a
[...]
You can filter sub directories by adding a prefix (here foo
directory). The prefix must not start with an /
.
$ 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 Options:
-r
= Raw Mode, no quotes in output.Contents[]
= GetContents
Object Array Content.Key
= Get every Key Field (does not produce a valid JSON Array, but we are in raw mode, so we don't care)
Addendum:
You can use pure AWS CLI, but the values will be seperated by \x09
= Horizontal Tab (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 Options:
--query "Contents[].Key"
= Query Contents Object Array and get every Key inside--output text
= Output as Tab delimited Text with now Quotes
Addendum based on Guangyang Li Comment:
Pure AWS CLI with New Line:
$ aws s3api list-objects --bucket "bucket" --prefix "foo/" --query "Contents[].{Key: Key}" --output text
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
[...]
You can't do this with just the aws
command, but you can easily pipe it to another command to strip out the portion you don't want. You also need to remove the --human-readable
flag to get output easier to work with, and the --summarize
flag to remove the summary data at the end.
Try this:
aws s3 ls s3://mybucket --recursive | awk '{print $4}'
Edit: to take spaces in filenames into account:
aws s3 ls s3://mybucket --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'
Simple Way
aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
A simple filter would be:
aws s3 ls s3://mybucket --recursive | perl -pe 's/^(?:\S+\s+){3}//'
This will remove the date, time and size. Left only the full path of the file. It also works without the recursive and it should also works with filename containing spaces.