решение bash для динамического построения значения параметра префикса моего скрипта тегов для команд командной строки AWS

#bash #aws-cli

Вопрос:

Я вызываю команды AWS CLI в скрипте bash. Мне нужно добавить теги к файлам, префикс которых выглядит следующим образом:

 /base/user1/foo/file1
/base/user2/foo/fileA
/base/user3/foo/fileX
 

Я хочу удалить их только в разделе «foo», но если у пользователя есть такие файлы, как:

 /base/user1/bar/fileZ
 

, Я не хочу удалять их в разделе «панель».

У меня есть сценарий:

!/бин/баш

 aws s3api list-objects --bucket myBucket --query 'Contents[].{Key: Key}' --prefix myPrefix --output text  | xargs -n 1 aws s3api put-object-tagging  --bucket myBucket --tagging "{"TagSet": [{ "Key": "myKey", "Value": "myValue" }]}" --key
 

Это работает нормально, пока myPrefix является абсолютным путем, таким как:

 /base/user1/foo/
 

, но у меня слишком много пользователей, чтобы вручную сделать это, поэтому я хотел сделать что-то вроде:

 /base/*/foo/
 

для приставки. Однако это приводит к ошибке:

Произошла ошибка (NoSuchKey) при вызове операции PutObjectTagging: Указанный ключ не существует

Есть ли способ в bash в цикле или что-то, что переходит на уровень «foo», чтобы я мог получить полный путь: префикс /база/пользователь1/foo/, /база/пользователь2/foo, /ase/пользователь3/foo, динамически определенный для префикса? Спасибо за любой ответ.

Комментарии:

1. find / -type d -name foo -print отобразит список всех каталогов foo в разделе / и выведет полный путь к каждому из них. Затем вы можете использовать grep для фильтрации те, которые вам нужны (или не нужны -v ). Как только у вас будет список, который вы ожидаете, вы можете добавить while цикл (см. mywiki. wooledge.org/BashFAQ/001 ) и обработайте каждый из них.

Ответ №1:

Я смог найти достойное решение самостоятельно. Замена этой строки из исходного сообщения:

 aws s3api list-objects --bucket myBucket --query 'Contents[].{Key: Key}' --prefix myPrefix --output text  | xargs -n 1 aws s3api put-object-tagging  --bucket myBucket --tagging "{"TagSet": [{ "Key": "myKey", "Value": "myValue" }]}" --key
 

, со следующими:

 for BUCKET_PATH in $(aws s3 ls --recursive --summarize $BUCKET);
do
if [[ $BUCKET_PATH == *$PREFIX* ]]; then
  echo $BUCKET_PATH
  aws s3api put-object-tagging  --bucket ${BUCKET} --key ${BUCKET_PATH} --tagging "{"TagSet": [{ "Key": "${KEY}", "Value": "${VALUE}" }]}"
fi
done
 

отлично работает.