2013-07-03 35 views
15

Ho un programma che carica correttamente tutti i file di cui ho bisogno. Ho nuovi file ogni giorno che devo caricare. Dopo aver caricato i file non ho più bisogno di loro e quindi non sto cercando di sincronizzarli.Verifica se un file si trova in un bucket S3 utilizzando s3cmd

Sono curioso di sapere se esiste un modo per verificare se viene fornito un percorso e il nome del file se questo esiste all'interno di S3 utilizzando s3cmd.

risposta

21

È possibile utilizzare il comando ls in s3cmd per sapere se un file è presente o meno in S3.

codice Bash

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

if [[ $count -gt 0 ]]; then 
     echo "exist" 
else 
     echo "do not exist" 
fi 

Uso: ./s3_exist.sh S3: //foo/bar.txt

Modifica:

Come cocoatomo rilevare nei commenti, s3cmd ls $path elenchi tutti i file che inizia con$path. Un approccio più sicuro sarebbe utilizzare s3cmd info $path e controllare il codice di uscita.

Nuova Bash codice

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

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

Quindi contare è il numero di file all'interno di quella directory, lo capisco. Tuttavia non ho trovato la parte -gt e non riesco a trovare nulla quando ho provato a cercarlo su google, ti dispiacerebbe spiegare la parte? –

+1

Contare il numero di file che corrispondono a un determinato percorso e nome file. Poiché S3 non supporta i nomi di file duplicati, questo conteggio sarà 0 (file non presente) o 1 (file presente). "-gt" sta per "maggiore di". Puoi anche fare [[$ count -eq 1]] se questo è più esplicito per te. Per ulteriori dettagli sull'espressione condizionale in Bash: [link] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

Il primo argomento di "s3cmd ls" indica un nome bucket o una stringa prefisso che segue un nome bucket, non un nome file. Poiché "s3cmd ls s3: // foo/b" elenca "s3: //foo/bar.txt" se esiste, "$ count -gt 0" non mostra se s3: // foo/b esiste o meno. – cocoatomo

2

Supponendo che bar.txt e bar.txt.bak esiste in un secchio S3: // foo "s3cmd ls s3: //foo/bar.txt" mostra un seguente risultato.

$ 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 

Poiché dovremmo rimuovere la seconda riga dal risultato del comando, utilizziamo il comando "awk" per filtrare le righe non necessarie.

$ filename=s3://foo/bar.txt 
$ s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" 
2013-11-11 11:11 5 s3://foo/bar.txt 

Infine, abbiamo creato tutti i comandi.

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

Nella versione più recente di AWS CLI, è possibile utilizzare il seguente codice per rilevare l'esistenza di un file o una directory

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

Possiamo usare s3cmd ls, Prendere una flag_exists bandiera vero se il file è lì e falso se il file non è lì.

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 

Spiegazione - Dal ls possono restituire molti valori come se u ricerca di s3cmd ls abc.txt, allora può restituire valori come abc.txt abcd.txt e così via, in modo da looping e controllando con se la condizione se il file esiste.

Problemi correlati