web-dev-qa-db-fra.com

Comment utiliser l'AWS CLI pour copier uniquement des fichiers dans le compartiment S3 qui correspondent à un modèle de chaîne donné

J'utilise l'AWS CLI pour copier des fichiers d'un compartiment S3 sur ma machine R à l'aide d'une commande comme ci-dessous:

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

Cela fonctionne comme prévu, c'est-à-dire qu'il copie tous les fichiers dans my_bucket_location qui ont "trans" dans le nom de fichier à cet emplacement.

Le problème auquel je suis confronté est que j'ai d'autres fichiers avec des conventions de dénomination similaires que je ne veux pas importer dans cette étape. À titre d'exemple, dans la liste ci-dessous, je souhaite uniquement copier les deux premiers fichiers, pas les deux derniers:

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

Si j'utilisais regex, je pourrais le rendre plus spécifique comme "^trans_\\d+" pour n'apporter que les deux premiers fichiers, mais cela ne semble pas possible en utilisant AWS CLI. Donc ma question est-il un moyen d'avoir une correspondance de modèle plus complexe en utilisant AWS CLI comme ci-dessous?

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

Veuillez noter que je ne peux utiliser que des informations sur le fichier en question, c'est-à-dire que je souhaite importer un fichier avec le modèle "^trans_\\d+", Je ne peux pas utiliser le fait que les autres fichiers indésirables contiennent sum_ au début, car ce n'est qu'un exemple, il pourrait y avoir d'autres fichiers avec des noms similaires comme "check_trans_120215.csv".

J'ai envisagé d'autres alternatives comme ci-dessous, mais en espérant qu'il existe un moyen d'ajuster la commande de copie pour éviter de descendre sur l'une de ces routes:

  • Liste de tous les éléments dans le compartiment> en utilisant l'expression régulière dans R pour spécifier les fichiers que je veux> Importer uniquement ces fichiers
  • Conserver la commande de copie telle quelle> supprimer les fichiers indésirables sur la machine R après la copie
11
Sam Gilbert

Les alternatives que vous avez répertoriées sont les meilleures options car la CLI S3 ne prend pas en charge regex.

tilisation des filtres d'exclusion et d'inclusion :

Actuellement, il n'y a pas de prise en charge pour l'utilisation de caractères génériques de style UNIX dans les arguments de chemin d'une commande. Cependant, la plupart des commandes ont des paramètres --exclude "" et --include "" qui peuvent atteindre le résultat souhaité. Ces paramètres effectuent une correspondance de modèle pour exclure ou inclure un fichier ou un objet particulier. Les symboles de modèle suivants sont pris en charge.

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

Mettre cela ici pour que les autres trouvent, car je devais juste le comprendre. Voici ce que j'ai trouvé:

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

Vous pouvez mettre l'expression régulière dans la chaîne de recherche grep. Par exemple, je cherchais des fichiers spécifiques à supprimer (d'où le s3cmd del). Mon expression régulière ressemblait à: '2016-11-04.*s3.*[DN][RS].*'. Vous devrez peut-être ajuster la coupe pour votre usage. Devrait également fonctionner avec s3cmd get.

2
crc32

voici la même solution pour la suppression, vous pouvez remplacer rm par cp vous pouvez le faire en utilisant aws cli: https://aws.Amazon.com/cli/ et une commande unix.

les commandes aws cli devraient fonctionner:

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

si vous souhaitez inclure des sous-dossiers, vous devez ajouter l'indicateur - récursif

ou avec des commandes 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'

explication:

  1. liste tous les fichiers sur le bucket - pipe ->
  2. obtenir le 4ème paramètre (c'est le nom du fichier) - pipe -> // vous pouvez le remplacer par la commande linux pour correspondre à votre modèle
  3. exécuter le script de suppression avec aws cli
0
ggcarmi