Вопрос или проблема
Я ищу папку в 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
), игнорируя имена файлов и дополнительные подкаталоги. Давайте структурируем решение и объясним его шаги:
Решение
-
Получение списка всех файлов и папок:
Используйте команду AWS CLI для полного перечисления содержимого директории, включая файлы:aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive
-
Фильтрация строк с нужными подстроками:
Вам нужно отфильтровать строки, которые содержат определенные подстроки, например,'dir3'
или'folder3'
. Для этого используйтеgrep
с регулярным выражением:grep -E 'dir3|folder3'
-
Удаление имен файлов из путей:
Следующий шаг — удалить концевую часть строк, содержащую имена файлов. Это можно достичь с помощью командыsed
:sed 's![^/]*$!!'
Эта команда удаляет часть строки от последнего символа слэша
/
до конца. -
Удаление дубликатов:
Чтобы получить уникальные пути, воспользуйтесь одной из двух команд:uniq
, которая удаляет подряд идущие дубли, или более универсальнойsort -u
, которая удаляет все дубликаты:sort -u
Итоговая команда
В результате вы получите такую команду, которая выполнит все вышеописанные шаги и выведет нужные уникальные пути:
aws s3 ls s3://bucketname/dir1/dir2/dir3 --recursive |
grep -E 'dir3|folder3' |
sed 's![^/]*$!!' |
sort -u
Комментарии и улучшения
-
Оптимизация: Обратите внимание на производительность, если у вас очень большой бакет. Используйте фильтрацию на этапе компреции результатов.
-
Сценарии и автоматизация: Для частого использования рассмотрите создание скрипта, который будет принимать параметры (например, имя бакета и фильтры), чтобы автоматизировать процесс.
-
Документация и обучение: Убедитесь, что все члены команды, использующие данный инструмент, понимают структуру команды и её результаты.
Следуя этим шагам, вы сможете эффективно находить и извлекать уникальные пути в папке S3. Эта методика обеспечивает точность и надежность, отвечая всем профессиональным требованиям.