Проверка наличия файла в ведре S3 с помощью s3cmd

У меня есть программа, которая успешно загружает все файлы, которые мне нужны. У меня есть новые файлы каждый день, которые мне нужно загрузить. После того, как я загрузил файлы, я больше не нуждаюсь в них, и поэтому не хочу их синхронизировать.

Мне любопытно, есть ли способ проверить, указан ли путь и имя файла, если он существует в S3, используя s3cmd.

Ответы

Ответ 1

Вы можете использовать команду ls в s3cmd, чтобы узнать, присутствует ли файл в S3.

Bash code

path=$1
count=`s3cmd ls $path | wc -l`

if [[ $count -gt 0 ]]; then
        echo "exist"
else
        echo "do not exist"
fi

Использование:./s3_exist.sh s3://foo/bar.txt

Edit:

Как указано в комментариях cocoatomo, s3cmd ls $path перечисляет весь файл, который начинается с $path. Более безопасным подходом было бы использовать s3cmd info $path и проверить код выхода.

Новый Bash код

path=$1
s3cmd info $path >/dev/null 2>&1

if [[ $? -eq 0 ]]; then
    echo "exist"
else
    echo "do not exist"
fi

Ответ 2

Предполагая, что bar.txt и bar.txt.bak существуют в ведре s3://foo, "s3cmd ls s3://foo/bar.txt" показывает следующий вывод.

$ s3cmd ls s3://foo/bar.txt
2013-11-11 11:11    5   s3://foo/bar.txt
2013-11-11 11:11    5   s3://foo/bar.txt.bak

Так как мы должны удалить вторую строку из результата команды, мы используем команду awk для фильтрации ненужных строк.

$ filename=s3://foo/bar.txt
$ s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }"
2013-11-11 11:11    5   s3://foo/bar.txt

Наконец, мы создаем все команды.

filename=s3://foo/bar.txt
count=$(s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" | wc -l)

if [ $count -eq 0 ]; then
  echo "file does not exist"
else
  echo "file exists"
fi

Ответ 3

В новой версии AWS CLI вы можете использовать следующий код для обнаружения существования файла или каталога

count=$(aws s3 ls $path | wc -l)
if [ $count -gt 0 ]
then
  (>&2 echo "$path already exists!")
  return
fi

Ответ 4

Мы можем использовать s3cmd ls. Возьмите флаг flag_exists true, если файл есть, и false, если файл не существует.

FLAG_EXISTS=false
    for j in $(s3cmd ls s3://abc//abc.txt); do
      if [[ "$j" == "s3://abc//abc.txt" ]]; then
        FLAG_EXISTS=true
        break
      fi
    done
    if [ "$FLAG_EXISTS" = false ]; then
      echo 'file not exists'
    else
      echo 'file exists'
    fi

Объяснение. Поскольку ls может возвращать многие значения, например, если u ищет s3cmd ls abc.txt, тогда он может возвращать значения, такие как abc.txt abcd.txt и т.д., поэтому цикл и проверка использования, если условие существует, если файл существует.