web-dev-qa-db-ja.com

AWS CLIを使用して、特定の文字列パターンに一致するS3バケット内のファイルのみをコピーする方法

AWS CLIを使用して、次のようなコマンドを使用してS3バケットからRマシンにファイルをコピーしています。

  system(
    "aws s3 cp s3://my_bucket_location/ ~/my_r_location/ --recursive --exclude '*' --include '*trans*' --region us-east-1"
    )

これは期待どおりに機能します。つまり、my_bucket_location内のファイル名に「trans」が含まれるすべてのファイルをコピーします。

私が直面している問題は、この手順でインポートしたくない同様の命名規則を持つ他のファイルがあることです。例として、以下のリストでは、最初の2つのファイルのみをコピーし、最後の2つのファイルはコピーしません。

File list
trans_120215.csv
trans_130215.csv
sum_trans_120215.csv
sum_trans_130215.csv

正規表現を使用している場合、"^trans_\\d+"のように最初の2つのファイルのみを取り込むように具体的にすることができますが、AWS CLIを使用してこれを行うことはできません。だから私の質問は、以下のようにAWS CLIを使用してより複雑なパターンマッチングを行う方法はありますか?

  system(
    "aws s3 cp s3://my_bucket_location/ ~/my_r_location/ --recursive --exclude '*' --include '^trans_\\d+' --region us-east-1"
    )

問題のファイルに関する情報しか使用できないことに注意してください。つまり、パターン"^trans_\\d+"のファイルをインポートしたいのですが、他の不要なファイルの最初にsum_が含まれているという事実は使用できません。これは、 「check_trans_120215.csv」のような類似した名前を持つ他のファイルが存在する可能性のある例にすぎません。

私は以下のような他の代替案を検討しましたが、これらのルートのいずれかを下がらないようにcopyコマンドを調整する方法があることを期待しています:

  • バケット内のすべてのアイテムを一覧表示する> Rで正規表現を使用して必要なファイルを指定する>それらのファイルのみをインポートする
  • コピーコマンドをそのまま保持>コピー後にRマシン上の不要なファイルを削除する
11
Sam Gilbert

S3 CLIはregexをサポートしていないため、リストした代替案が最良のオプションです。

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

現在、コマンドのパス引数でUNIXスタイルのワイルドカードを使用することはサポートされていません。ただし、ほとんどのコマンドには--exclude ""および--include ""パラメーターがあり、目的の結果を得ることができます。これらのパラメータは、特定のファイルまたはオブジェクトを除外または含めるためにパターンマッチングを実行します。次のパターン記号がサポートされています。

*: Matches everything
?: Matches any single character
[sequence]: Matches any character in sequence
[!sequence]: Matches any character not in sequence
10
helloV

私がこれを理解しなければならなかったので、他の人が見つけられるようにこれをここに置きます。これが私が思いついたものです:

s3cmd del $(s3cmd ls s3://[BUCKET]/ | grep '.*s3://[BUCKET]/[FILENAME]' | cut -c 41-)

正規表現をgrep検索文字列に含めることができます。たとえば、削除する特定のファイルを検索していました(したがって、s3cmd del)。私の正規表現は次のようになりました:'2016-11-04.*s3.*[DN][RS].*'。使用するためにカットを調整する必要がある場合があります。 s3cmd get

2
crc32

これは削除のための同じソリューションです、rmcpで置き換えることができますaws cli: https://aws.Amazon.com/cli/ といくつかのunixコマンドを使用してそれを行うことができます。

このaws cliコマンドは機能するはずです:

aws s3 rm s3://<your_bucket_name> --exclude "*" --include "<your_regex>"

サブフォルダを含める場合は、フラグ-recursiveを追加する必要があります

またはunixコマンド:

aws s3 ls s3://<your_bucket_name>/ | awk '{print $4}' | xargs -I%  <your_os_Shell>   -c 'aws s3 rm s3:// <your_bucket_name>/% $1'

説明:

  1. バケット上のすべてのファイルをリストします-pipe->
  2. 4番目のパラメーター(そのファイル名)を取得します-pipe->//パターンに一致するようにlinuxコマンドで置き換えることができます
  3. aws cliで削除スクリプトを実行する
0
ggcarmi