次のコマンドを使用して、aws cliを使用してs3バケット内のファイルを一覧表示しています( documentation ):
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
ファイルリストのみを表示するために、日付、時刻、およびファイルサイズを省略するにはどうすればよいですか?
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]*//'
単純なフィルターは次のとおりです。
aws s3 ls s3://mybucket --recursive | Perl -pe 's/^(?:\S+\s+){3}//'
これにより、日付、時刻、サイズが削除されます。ファイルのフルパスのみを残します。また、再帰なしで動作し、スペースを含むファイル名でも動作するはずです。
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
= Rawモード、出力に引用符なし.Contents[]
= Get Contents
Object Array Content.Key
=すべてのキーフィールドを取得します(有効なJSON配列は生成されませんが、rawモードなので、気にしません)補遺:
純粋なAWS CLIを使用できますが、値は\x09
= Horizontal 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 [...]
AWS CLIオプション:
--query "Contents[].Key"
=コンテンツオブジェクト配列をクエリし、内部のすべてのキーを取得する--output text
=引用符付きのタブ区切りテキストとして出力シンプルな方法
aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
fileの名前の場合のみ、最も簡単な名前を見つけます。
aws s3 ls s3://path/to/bucket/ | cut -d " " -f 4
これは、返された出力をスペース(cut -d " "
)で切り取り、ファイル名のリストである4番目の列(-f 4
)を返します。
簡単なコマンドは
aws s3 ls s3://mybucket --recursive --human-readable --summarize |cut -d ' ' -f 8
タイムスタンプが必要な場合は、コマンドフィールドの値を更新するだけです。
私の解決策
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