объединение команды bash с командой aws s3 cp - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно скопировать некоторые файлы с Linux-машины в корзину s3. Мне нужно скопировать только выбранные файлы. Я могу получить файлы, используя команду bash ниже.

ls -1t /var/lib/pgsql/backups/full/backup_daily/test* | tail -n +8

Теперь я хочу объединить эту команду bash с командой aws s3 cp. Я искал не и найти ниже решение, но оно не работает

ls -1t /var/lib/pgsql/backups/full/backup_daily/test* | tail -n +8  | aws s3 cp - s3://all-postgresql-backup/dev/

Как я могу сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Возможно, вы захотите взглянуть на команды S3 sync и s3 copy with --exclude.

aws s3 sync . s3://mybucket --exclude "*.jpg"

У вас может быть простое задание cron, которое запускается в фоновом режиме каждые несколько минут и синхронизирует каталоги.

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

https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

0 голосов
/ 05 сентября 2018

Если вы находитесь на платформе с инструментами GNU (find, sort, tail, sed), и вы хотите вставить все имена в положение, где у вас есть -, надежное выполнение этого (способом, устойчивым к неожиданным именам файлов) может выглядеть следующим образом:

find /var/lib/pgsql/backups/full/daily_backup -name 'guest*' -type f -printf '%T@ %p\0' |
  sort -znr |
  tail -z -n +8 |
  sed -zEe 's/[^ ]+ //' |
  xargs -0 sh -c 'aws s3 cp "$@" s3://all-postgresql-backup/ncldevshore/' _

Там много всего, так что давайте рассмотрим его по частям:

  • ls не генерирует вывод, безопасный для программного использования. Таким образом, вместо этого мы используем find со строкой -printf, которая ставит метку времени (в эпоху UNIX, секунды с 1970 года) перед каждым файлом и завершает каждую запись NUL (символом, который, в отличие от новой строки, не может существует в именах файлов в UNIX).
  • sort -z - расширение GNU, которое разделяет ввод и вывод значениями NUL; -n указывает числовую сортировку (поскольку метки времени являются числовыми); -r меняет порядок сортировки.
  • sed -z - это расширение GNU, которое опять-таки разграничивает записи по NUL, а не по новым строкам; здесь мы убираем временные метки с записей после их сортировки.
  • xargs -0 ... указывает xargs читать записи, разделенные NUL, из stdin и добавлять их в список аргументов ..., разбивая его на несколько вызовов всякий раз, когда это превышает максимальную длину командной строки.
  • sh -c '..."$@"...' _ запускает оболочку - sh - с командой, включающей "$@", которая расширяется до списка аргументов, которые были переданы оболочкой. _ является заполнителем для $0. xargs поместит имена, созданные предыдущим конвейером после _, ставшие $1, $2 и т. Д., Так что они будут помещены в командную строку aws вместо "$@".

Ссылки

  • BashFAQ # 3 - Как сортировать или сравнивать файлы на основе некоторого атрибута метаданных (самое новое / самое старое время изменения, размер и т. Д.)?
  • ParsingLs - Почему вы не должны анализировать вывод ls
  • UsingFind - см. Раздел «Действия в массовом порядке» для обсуждения мер предосторожности, необходимых для использования xargs без внесения ошибок (что приведено в приведенном выше коде, но другие рекомендации могут и не делать).
...