2013-07-03 16 views
15

を使用してS3バケットに入っているかどうか確認します。必要なファイルをすべて正常にアップロードするプログラムがあります。私は新しいファイルを毎日アップロードしなければなりません。私はファイルをアップロードした後、もはやそれらを必要とせず、従ってそれらを同期させることを望んでいない。ファイルがs3cmd

s3cmdを使用してS3内に存在する場合は、パスとファイル名があるかどうかを確認する方法があるかどうか不思議です。

答えて

21

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を使用して終了コードを確認することです。

新しいバッシュは、コード

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

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

countは、そのディレクトリ内のファイル数です。私はそれを理解しています。しかし、私はそれを説明しようと思ったのですか? –

+1

指定されたパスとファイル名に一致するファイルの数をカウントします。 S3は重複したファイル名をサポートしていないので、このカウントは0(ファイルが存在しない)または1(ファイルが存在する)のいずれかになります。 "-gt"は "より大きい"の略です。これがもっと明白な場合は[[$ count -eq 1]]を実行することもできます。 Bashの条件式の詳細については、[リンク](http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

"s3cmd ls"の最初の引数は、バケット名、またはファイル名ではなくバケット名に続く接頭文字列。 "s3cmd ls s3:// foo/b"は "s3://foo/bar.txt"をリストしているので、 "$ count -gt 0"はs3:// foo/bが存在するかどうかを表示しません。 – cocoatomo

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 

最後に、すべてのコマンドをビルドします。 AWS CLIの新しいバージョンで

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 
2

、あなたはファイルならば真1フラグflag_existsを取る、我々はs3cmd LSを使用することができ、ファイルやディレクトリ

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

の存在を検出するために、次のコードを使用することができますそこにファイルがない場合は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 

説明 - uはabc.txt s3cmdのLSを検索する場合、それはとてもループと条件の場合ならば使用してチェックし、abc.txt abcd.txtなどのような値を返すことができるようにlsが多くの値を返すことができるので、ファイルが存在しています。

関連する問題