必要なすべてのファイルを正常にアップロードするプログラムがあります。アップロードする必要がある新しいファイルが毎日あります。ファイルをアップロードした後、それらは不要になったため、同期するつもりはありません。
s3cmd を使用して S3 内にパスとファイル名が存在するかどうかを確認する方法があるかどうか知りたいです。
必要なすべてのファイルを正常にアップロードするプログラムがあります。アップロードする必要がある新しいファイルが毎日あります。ファイルをアップロードした後、それらは不要になったため、同期するつもりはありません。
s3cmd を使用して S3 内にパスとファイル名が存在するかどうかを確認する方法があるかどうか知りたいです。
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
すべてのファイルを一覧表示します。より安全な方法は、終了コードを使用して確認することです。 $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
コマンド結果から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