Найти конкретный путь к папке в бакете S3.

Вопрос или проблема

Я ищу папку в s3 bucket, используя эту команду

aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive | grep -i 'dir3'

Она возвращает результаты, такие как

dir1/dir2/dir3/1/aaa.txt 
dir1/dir2/dir3/1/bbb.txt
dir1/dir2/dir3/1/ccc.txt

Однако, мне нужен только путь к этому файлу, такой как

dir1/dir2/dir3

Я могу удалить ненужный текст, чтобы получить путь директории, используя это

aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive | grep -i 'dir2' | head -n 1 | sed 's/1.*//'

Но это не работает с множественным поиском строк в grep

aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive | grep -i 'dir3\|folder3'

Мне нужен вывод, такой как

dir1/dir2/dir3
folder1/folder2/folder3

Вы можете сделать что-то вроде:

for i in `aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive | grep -i 'dir3' `
do
dirname $i >>/tmp/file
done
sort -u /tmp/file >/tmp/file1

И в конце у вас будет список поддиректорий в файле /tmp/file1

Вы можете удалить имена файлов с конца каждого пути с помощью операции sed. Вы можете затем удалить смежные дубликаты с помощью uniq, или, если дубликаты возникают не по соседству, используйте sort -u.

Результат потом можно искать по мере необходимости,

aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive |
    sed 's![^/]*$!!' |
    uniq |
    grep -Ewi 'dir3|folder1'

Ответ или решение

Если у вас возникает задача поиска конкретного пути в папке S3, существует несколько способов оптимизировать и упростить процесс, используя комбинацию команд AWS CLI, grep, sed, и sort. Рассмотрим, как добиться желаемого результата — нахождения уникальных путей к папкам внутри заданного бакета.

Задача

Вы хотите находить и выводить только уникальные пути к папкам (например, dir1/dir2/dir3), игнорируя имена файлов и дополнительные подкаталоги. Давайте структурируем решение и объясним его шаги:

Решение

  1. Получение списка всех файлов и папок:
    Используйте команду AWS CLI для полного перечисления содержимого директории, включая файлы:

    aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive
  2. Фильтрация строк с нужными подстроками:
    Вам нужно отфильтровать строки, которые содержат определенные подстроки, например, 'dir3' или 'folder3'. Для этого используйте grep с регулярным выражением:

    grep -E 'dir3|folder3'
  3. Удаление имен файлов из путей:
    Следующий шаг — удалить концевую часть строк, содержащую имена файлов. Это можно достичь с помощью команды sed:

    sed 's![^/]*$!!'

    Эта команда удаляет часть строки от последнего символа слэша / до конца.

  4. Удаление дубликатов:
    Чтобы получить уникальные пути, воспользуйтесь одной из двух команд: uniq, которая удаляет подряд идущие дубли, или более универсальной sort -u, которая удаляет все дубликаты:

    sort -u

Итоговая команда

В результате вы получите такую команду, которая выполнит все вышеописанные шаги и выведет нужные уникальные пути:

aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive |
    grep -E 'dir3|folder3' |
    sed 's![^/]*$!!' |
    sort -u

Комментарии и улучшения

  • Оптимизация: Обратите внимание на производительность, если у вас очень большой бакет. Используйте фильтрацию на этапе компреции результатов.

  • Сценарии и автоматизация: Для частого использования рассмотрите создание скрипта, который будет принимать параметры (например, имя бакета и фильтры), чтобы автоматизировать процесс.

  • Документация и обучение: Убедитесь, что все члены команды, использующие данный инструмент, понимают структуру команды и её результаты.

Следуя этим шагам, вы сможете эффективно находить и извлекать уникальные пути в папке S3. Эта методика обеспечивает точность и надежность, отвечая всем профессиональным требованиям.

Оцените материал
Добавить комментарий

Капча загружается...