У меня есть прецедент, когда я программным образом вывожу экземпляр, копию и исполняемый файл EC2 из S3, запускаю его и завершаю экземпляр (выполняется в пользовательских данных). Мне нужно получить только последний добавленный файл из S3. Есть ли способ получить последний измененный файл/объект из ведра S3 с помощью CLI?
Получить последний измененный объект из S3 CLI
Ответ 1
Вы можете перечислить все объекты в ведре с помощью aws s3 ls $BUCKET --recursive
:
$ aws s3 ls $BUCKET --recursive
2015-05-05 15:36:17 4 an_object.txt
2015-06-08 14:14:44 16322599 some/other/object
2015-04-29 12:09:29 32768 yet-another-object.sh
Они сортируются по алфавиту по ключу, но этот первый столбец является последним измененным временем. Быстрый sort
будет изменять порядок их по дате:
$ aws s3 ls $BUCKET --recursive | sort
2015-04-29 12:09:29 32768 yet-another-object.sh
2015-05-05 15:36:17 4 an_object.txt
2015-06-08 14:14:44 16322599 some/other/object
tail -n 1
выбирает последнюю строку, а awk '{print $4}'
извлекает четвертый столбец (имя объекта).
$ aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'
some/other/object
И последнее, но не менее важное: отбросьте это на aws s3 cp
, чтобы загрузить объект:
$ KEY=`aws s3 ls $BUCKET --recursive | sort | tail -n 1 | awk '{print $4}'`
$ aws s3 cp s3://$BUCKET/$KEY ./latest-object
Ответ 2
aws s3api list-objects-v2 --bucket "bucket-name" |jq -c ".[] | max_by(.LastModified)|.Key"
Ответ 3
Ниже приведено bash script, который загружает последний файл из S3 Bucket. Вместо этого я использовал команду AWS S3 Synch, чтобы она не загружала файл из S3, если он уже существует.
- исключить, исключая все файлы
- включить, включает в себя все файлы, соответствующие шаблону
#!/usr/bin/env bash
BUCKET="s3://my-s3-bucket-eu-west-1/list/"
FILE_NAME=`aws s3 ls $BUCKET | sort | tail -n 1 | awk '{print $4}'`
TARGET_FILE_PATH=target/datdump/
TARGET_FILE=${TARGET_FILE_PATH}localData.json.gz
echo $FILE_NAME
echo $TARGET_FILE
aws s3 sync $BUCKET $TARGET_FILE_PATH --exclude "*" --include "*$FILE_NAME*"
cp target/datdump/$FILE_NAME $TARGET_FILE
p.s. Спасибо @David Murray
Ответ 4
Если это только что загруженный файл, вы можете использовать Lambda для выполнения фрагмента кода на новом объекте S3.
Если вам действительно нужно получить самую последнюю, вы можете сначала назвать файлы с датой, отсортировать по имени и взять первый объект.
Ответ 5
Эта команда просто выполняет работу без каких-либо внешних зависимостей:
aws s3api list-objects-v2 --bucket "my-awesome-bucket" --query 'reverse(sort_by(Contents, &LastModified))[:1].Key' --output=text