web-dev-qa-db-ja.com

AWS CLIでS3バケットの複数のファイルを削除する方法

x.y.zという名前のS3バケットがあるとします

このバケットには、数百のファイルがあります。しかし、purple.gifworksheet.xlsxという名前の2つのファイルのみを削除したい

rmを1回呼び出すことで、AWSコマンドラインツールからこれを実行できますか?

これは機能しませんでした:

$ aws s3 rm s3://x.y.z/worksheet.xlsx s3://x.y.z/purple.gif
Unknown options: s3://x.y.z/purple.gif

manual から、ファイルのリストを名前で明示的に削除できるようには見えません。誰かがそれを行う方法を知っていますか? --recursiveフラグを使用しないことを好みます。

14
Saqib Ali

s3 rmは使用できませんが、 s3api delete-objects は使用できます。

aws s3api delete-objects --bucket x.y.z --delete '{"Objects":[{"Key":"worksheet.xlsx"},{"Key":"purple.gif"}]}'
12
spg

これを行うには、--excludeまたは--include引数を複数回指定します。ただし、これを機能させるには--recursiveを使用する必要があります。

複数のフィルターがある場合、フィルターパラメーターの順序が重要であることを覚えておいてください。ルールは、コマンドの後半に表示されるフィルターが、コマンドの前に表示されるフィルターよりも優先されることです。

aws s3 rm s3://x.y.z/ --recursive --exclude "*" --include "purple.gif" --include "worksheet.xlsx"

ここでは、purple.gifおよびworksheet.xlsxを除くすべてのファイルがコマンドから除外されます。

よくわからない場合は、必ず最初に--dryrunを試し、どのファイルが削除されるかを調べてください。

ソース: フィルターの除外および包含の使用

34
Khalid T.

AWS S3でUNIXワイルドカードを使用する(AWS CLI)

現在、AWS CLIは、コマンドの「パス」引数でUNIXワイルドカードのサポートを提供していません。ただし、いくつかのaws s3コマンドで使用可能な--excludeパラメーターと--includeパラメーターを使用すると、この機能を簡単に複製できます。

使用可能なワイルドカードは次のとおりです。

"*" –すべてに一致

"?" –任意の1文字と一致

"[]" –カッコ内の任意の1文字と一致

"[!]" –カッコ内にない任意の1文字と一致

-includeおよび-excludeをaws s3コマンドで使用する場合の注意事項:

任意の数の-includeおよび-excludeパラメーターを使用できます。

後で渡されたパラメーターは、以前に渡されたパラメーターよりも優先されます(同じコマンドで)。

すべてのファイルとオブジェクトはデフォルトで「included」であるため、特定のファイルのみを含めるには、「exclude」、次に「include」を使用する必要があります。 --recursiveは-includeおよび-excludeと組み合わせて使用​​する必要があります。そうしないと、コマンドは単一のファイル/オブジェクト操作のみを実行します。

例:すべてのファイルを作業ディレクトリからbig-datumsバケットにコピーします:

aws s3 cp ./ s3://big-datums/ --recursive

ビッグデータバケットからすべての「.Java」ファイルを削除します:

aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.Java"

「j」または「c」で始まるファイル拡張子を持つビッグデータバケット内のすべてのファイルを削除します(「.csv」、「。Java」、「。json」、。「jpeg」など):

aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"

「。txt」および「.csv」ファイルをbig-datums S3バケットからローカル作業ディレクトリにコピー:

aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv"

#Copy all files from working directory to the big-datums bucket:
aws s3 cp ./ s3://big-datums/ --recursive

#Delete all ".Java" files from the big-datums bucket:
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.Java"

#Delete all files in the big-datums bucket with a file extension beginning with "j" or "c" (".csv", ".Java, ".json", ."jpeg", etc.):
aws s3 rm s3://big-datums/ --recursive --exclude "*" --include "*.[jc]*"

#Copy ".txt" and ".csv" files from big-datums S3 bucket to local working directory:
aws s3 cp s3://big-datums/ . --recursive --exclude "*" --include "*.txt" --include "*.csv" ```
3
Sunny Sharma

これはコマンドラインから便利だと思いました。 400万を超えるファイルがあり、バケットを空にするのに1週間近くかかりました。これは、AWSコンソールがログを説明していないため便利です。

注:jqueryをインストールする必要があります

 aws s3api list-object-versions --bucket YOUrBUCKEtNAMeHERe-processed --output json --query 'Versions[].[Key, VersionId]' | jq -r '.[] | "--key '\''" + .[0] + "'\'' --version-id " + .[1]' | xargs -L1 aws s3api delete-object --bucket YOUrBUCKEtNAMeHERe
1
coder

次のことに注意してください。

aws s3 rm s3://x.y.z/ --recursive --include "\*.gif"は、"\*.gif"を含むパス上のすべてのファイルを削除します

aws s3 rm s3://x.y.z/ --recursive --exclude "\*" --include "\*.gif"は、"\*.gif"に一致するファイルのみを削除します

1
ddrypczewski

このソリューションは、オブジェクト名にワイルドカードを指定する場合に機能します。

aws s3 ls dmap-live-dwh-files/backup/mongodb/oms_api/hourly/ | grep order_2019_08_09_* | awk {'print "aws s3 rm s3://dmap-live-dwh-files/backup/mongodb/oms_api/hourly/" $4'} | bash 
0
Yogesh Patil

どうやらaws s3 rmは個々のファイル/オブジェクトでのみ機能します。

以下は、ある程度成功して動作するbashコマンドです(少し遅いですが動作します):

aws s3 ls s3://bucketname/foldername/ | 
awk {'print "aws s3 rm s3://bucketname/foldername/" $4'} | 
bash

オブジェクト名にスペースや変な文字が含まれていると、問題に直面する可能性があることに注意してください。これは、「aws s3 ls」コマンドがそのようなオブジェクトをリストしないためです。

0
Thyag