#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
отлично работает.