#!/usr/bin/env bash # Creates a file containing the names of all files in a specific bucket. # # e.g. aws-list-deep-glacier-files my-deep-glacier images image_list # # You'll need the aws cli tools. Download them from https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html # # If you see an error like along the lines of "'charmap' codec can't encode # character '\u200e' in position 42: character maps to " then that # means a filename has a Unicode codepoint and the dumb aws Python code is # trying to read it using your system's locale, which is very likely not set to # use the Windows UTF-8 beta feature. This is an ongoing issue in this tool # that goes back to 2013!!! There's no way to fix it using environment # variables, at least nothing worked for me. The fix provided by the devs is # heavy handed: you change your system locale to use UTF-8... This has # consequences though like breaking legacy apps that don't have Unicode support # and I'm sure other weird things will happen, such as file corruption. Anyway, # if you're getting this charmap error then I suggest changing your system # locale, run this again, then switch back to your previous locale. If you # don't get the canonical file name then you won't be able to restore it. # # You can enable the UTF-8 locale with: # # win+r -> intl.cpl -> Administrative tab -> Change system locale -> Beta: Use Unicode UTF-8 box. # if which tput >/dev/null 2>&1; then ncolors=$(tput colors) fi if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then RED="$(tput setaf 1)" GREEN="$(tput setaf 2)" YELLOW="$(tput setaf 3)" BLUE="$(tput setaf 4)" MAGENTA="$(tput setaf 5)" CYAN="$(tput setaf 6)" BOLD="$(tput bold)" NORMAL="$(tput sgr0)" else RED="" GREEN="" YELLOW="" BLUE="" MAGENTA="" CYAN="" BOLD="" NORMAL="" fi error() { printf "${BOLD}${RED}$1${NORMAL}\n" } abort() { error "\nAborting...\n" exit 1 } set -e bucket="$1" path="$2" output_file="$3" if [[ $bucket == "" || $path == "" || $output_file == "" ]]; then error "Usage: aws-list-deep-glacier-files " exit 1 fi aws s3api list-objects-v2 --bucket $bucket --prefix $path --query "Contents[?StorageClass=='DEEP_ARCHIVE']" --output text | LC_ALL=C awk '{print substr($0, index($0, $2))}' | awk '{NF-=3};3' > "$output_file"