web-dev-qa-db-ja.com

aws s3 lsコマンドのファイルのみを表示する方法は?

次のコマンドを使用して、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

ファイルリストのみを表示するために、日付、時刻、およびファイルサイズを省略するにはどうすればよいですか?

35
Borealis

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]*//'
55
Mark B

単純なフィルターは次のとおりです。

aws s3 ls s3://mybucket --recursive | Perl -pe 's/^(?:\S+\s+){3}//'

これにより、日付、時刻、サイズが削除されます。ファイルのフルパスのみを残します。また、再帰なしで動作し、スペースを含むファイル名でも動作するはずです。

7
Celogeek San

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 = 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   [...]

AWS CLIオプション:

  • --query "Contents[].Key" =コンテンツオブジェクト配列をクエリし、内部のすべてのキーを取得する
  • --output text =引用符付きのタブ区切りテキストとして出力
6
notes-jj

シンプルな方法

aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
3
Tech Support

fileの名前の場合のみ、最も簡単な名前を見つけます。

aws s3 ls s3://path/to/bucket/ | cut -d " " -f 4

これは、返された出力をスペース(cut -d " ")で切り取り、ファイル名のリストである4番目の列(-f 4)を返します。

1

簡単なコマンドは

aws s3 ls s3://mybucket --recursive --human-readable --summarize |cut -d ' ' -f 8

タイムスタンプが必要な場合は、コマンドフィールドの値を更新するだけです。

1
skipper21

私の解決策

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
1
nsantana