Проверка наличия файла в ведре 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 и т.д., поэтому цикл и проверка использования, если условие существует, если файл существует.