it-swarm.com.ru

Как отобразить только файлы из команды aws s3 ls?

Я использую aws cli для вывода списка файлов в корзину s3 с помощью следующей команды ( Документация ):

aws s3 ls s3://mybucket --recursive --human-readable --summarize

Эта команда дает мне следующий вывод:

2013-09-02 21:37:53   10 Bytes a.txt
2013-09-02 21:37:53  2.9 MiB foo.Zip
2013-09-02 21:32:57   23 Bytes foo/bar/.baz/a
2013-09-02 21:32:58   41 Bytes foo/bar/.baz/b
2013-09-02 21:32:57  281 Bytes foo/bar/.baz/c
2013-09-02 21:32:57   73 Bytes foo/bar/.baz/d
2013-09-02 21:32:57  452 Bytes foo/bar/.baz/e
2013-09-02 21:32:57  896 Bytes foo/bar/.baz/hooks/bar
2013-09-02 21:32:57  189 Bytes foo/bar/.baz/hooks/foo
2013-09-02 21:32:57  398 Bytes z.txt

Total Objects: 10
   Total Size: 2.9 MiB

Тем не менее, это мой желаемый результат:

a.txt
foo.Zip
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
foo/bar/.baz/d
foo/bar/.baz/e
foo/bar/.baz/hooks/bar
foo/bar/.baz/hooks/foo
z.txt

Как я могу опустить дату, время и размер файла, чтобы показать только список файлов?

27
Borealis

Вы не можете сделать это только с помощью команды aws, но вы можете легко передать ее другой команде, чтобы удалить ненужную часть. Вам также необходимо убрать флаг --human-readable, чтобы облегчить работу с выводом, и флаг --summarize, чтобы удалить итоговые данные в конце.

Попробуй это:

aws s3 ls s3://mybucket --recursive | awk '{print $4}'

Правка: чтобы учитывать пробелы в именах файлов:

aws s3 ls s3://mybucket --recursive | awk '{$1=$2=$3=""; print $0}' | sed 's/^[ \t]*//'
42
Mark B

Простой фильтр будет:

aws s3 ls s3://mybucket --recursive | Perl -pe 's/^(?:\S+\s+){3}//'

Это удалит дату, время и размер. Оставил только полный путь к файлу. Он также работает без рекурсии и должен также работать с именем файла, содержащим пробелы.

7
Celogeek San

Только для file names я считаю, что проще всего будет:

aws s3 ls s3://path/to/bucket/ | cut -d " " -f 4

Это обрежет возвращенный вывод в пробелах (cut -d " ") и вернет четвертый столбец (-f 4), который является списком имен файлов.

2
Michael Silverstein

Простой способ

aws s3 ls s3://mybucket --recursive --human-readable --summarize|cut -c 29-
2
Tech Support

Используйте s3api с jq ( AWS document aws s3api list-objects ):

Этот режим всегда рекурсивный.

$ aws s3api list-objects --bucket "bucket" | jq -r '.Contents[].Key'
a.txt
foo.Zip
foo/bar/.baz/a
[...]

Вы можете отфильтровать подкаталоги, добавив префикс (здесь каталог foo). Префикс не должен начинаться с /.

$ aws s3api list-objects --bucket "bucket" --prefix "foo/" | jq -r '.Contents[].Key'
foo/bar/.baz/a
foo/bar/.baz/b
foo/bar/.baz/c
[...]

параметры jq:

  • -r = Raw Mode, без кавычек в выводе
  • .Contents[] = получить Contents объект массива содержимого
  • .Key = Получить каждое поле ключа (не генерирует допустимый массив JSON, но мы находимся в необработанном режиме, поэтому нам все равно)
1
notes-jj

Простая команда будет

aws s3 ls s3://mybucket --recursive --human-readable --summarize |cut -d ' ' -f 8

Если вам нужна временная метка, просто обновите значения поля команды.

0
skipper21