If statement 使用s3cmd检查文件是否在S3存储桶中

If statement 使用s3cmd检查文件是否在S3存储桶中,if-statement,amazon-s3,If Statement,Amazon S3,我有一个程序可以成功上传我需要的所有文件。我每天都有新的文件需要上传。在我上传了文件后,我不再需要它们,因此我不想同步它们 我很好奇是否有办法使用s3cmd检查S3中是否存在给定的路径和文件名。您可以使用s3cmd中的ls命令来了解S3中是否存在文件 Bash代码 path=$1 count=`s3cmd ls $path | wc -l` if [[ $count -gt 0 ]]; then echo "exist" else echo "do not ex

我有一个程序可以成功上传我需要的所有文件。我每天都有新的文件需要上传。在我上传了文件后,我不再需要它们,因此我不想同步它们


我很好奇是否有办法使用s3cmd检查S3中是否存在给定的路径和文件名。

您可以使用s3cmd中的ls命令来了解S3中是否存在文件

Bash代码

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

if [[ $count -gt 0 ]]; then
        echo "exist"
else
        echo "do not exist"
fi
path=$1
s3cmd info $path >/dev/null 2>&1

if [[ $? -eq 0 ]]; then
    echo "exist"
else
    echo "do not exist"
fi
用法:./s3_exist.sh s3://foo/bar.txt

编辑:

正如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

假设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

在较新版本的AWS CLI中,可以使用以下代码检测文件或目录的存在

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

我们可以使用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可以返回许多值,如搜索s3cmd ls abc.txt,那么它可以返回值,如abc.txt abcd.txt等,因此使用if条件循环检查文件是否存在

所以count是那个目录中的文件数,我知道。然而,我没有遇到过-gt部分,在我尝试用谷歌搜索时找不到任何东西,你介意解释一下该部分吗?计算与给定路径和文件名匹配的文件数。由于S3不支持重复的文件名,因此此计数将为0(文件不存在)或1(文件存在)。“-gt”代表“大于”。如果这对您来说更明确,您也可以执行[$count-eq 1]]。有关Bash中条件表达式的更多详细信息:“s3cmd ls”的第一个参数表示bucket名称或bucket名称后面的前缀字符串,而不是文件名。由于“s3cmd ls s3://foo/b”列出了“s3://foo/bar.txt”(如果存在),“$count-gt 0”不显示s3://foo/b是否存在。不幸的是,人们根本无法信任
s3cmd
的退出代码;即使Ubuntu14.04 universe中提供的版本在
s3cmd put
中也可以返回0,即使服务器的网络未连接。