18

必要なすべてのファイルを正常にアップロードするプログラムがあります。アップロードする必要がある新しいファイルが毎日あります。ファイルをアップロードした後、それらは不要になったため、同期するつもりはありません。

s3cmd を使用して S3 内にパスとファイル名が存在するかどうかを確認する方法があるかどうか知りたいです。

4

4 に答える 4

29

s3cmd で ls コマンドを使用して、ファイルが S3 に存在するかどうかを確認できます。

バッシュコード

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

編集:

cocoatomo がコメントで指摘したように、で始まるs3cmd ls $pathすべてのファイルを一覧表示します。より安全な方法は、終了コードを使用して確認することです。 $paths3cmd info $path

新しい Bash コード

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

if [[ $? -eq 0 ]]; then
    echo "exist"
else
    echo "do not exist"
fi
于 2013-07-03T19:05:33.933 に答える
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

コマンド結果から2行目を削除する必要があるため、「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
于 2013-11-25T10:01:30.493 に答える