2014-11-17 4 views
16
aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile" 

Copia sempre myfile su s3 - Vorrei copiare SOLO file se non esiste, altrimenti lanciare l'errore. Come posso farlo? O almeno come posso usare awscli per verificare se il file esiste?Come cpare il file solo se non esiste, altrimenti lanciare un errore?

+0

Correlati: [GH-404] (https://github.com/aws/aws-cli/issues/404), [GH-1449] (https://github.com/aws/aws-cli/issues/1449) e [GH-2874] (https://github.com/aws/aws-cli/issues/2874) su GitHub. – kenorb

risposta

19

È possibile verificare l'esistenza di un file elencando il file e verificando se restituisce qualcosa. Ad esempio:

aws s3 ls s3://bucket/file.txt | wc -l 

Ciò restituirebbe uno zero (senza righe) se il file non esiste.


Se solo si desidera copiare un file se non esiste, provare il comando sync, ad esempio:

aws s3 sync . s3://bucket/ --exclude '*' --include 'file.txt' 

Questo sincronizzare il file locale con l'oggetto remoto, copiandolo solo se non esiste o se il file locale è diverso dall'oggetto remoto.

+3

'aws s3 ls s3: //bucket/file.txt | wc -l' non è accurato: elencherà i file con quel prefisso, piuttosto che il nome esatto. Considera quanto segue: http://stackoverflow.com/a/17456170/391618 –

+6

sync NON funziona su file, solo directory. – mgoldwasser

+0

@mgoldwasser sincronizza ora il lavoro sui file? – olala

11

Quindi, risulta che "aws s3 sync" non esegue file, ma solo directory. Se gli dai un file, ottieni un ... interessante ... comportamento, dal momento che tratta qualsiasi cosa tu gli dia come una directory e la butta su una barra. Almeno aws-cli/1.6.7 Python/2.7.5 Darwin/13.4.0 fa.

%% date > test.txt 
    %% aws s3 sync test.txt s3://bucket/test.txt 
    warning: Skipping file /Users/draistrick/aws/test.txt/. File does not exist. 

Quindi, se si -really- solo desidera sincronizzare un file (upload soltanto se esiste, e se checksum corrisponde) lo si può fare:

file="test.txt" 
    aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 

Annotare il escludere/includere ordine - se lo inverti, non includerà nulla. E il tuo percorso di origine e inclusione deve avere un buon equilibrio intorno alla loro corrispondenza, quindi forse un $ (nome di base $ file) è in ordine per --include se stai usando percorsi completi ... aws --debug s3 sync è il tuo amico qui per vedere come valutano gli include.

E non dimenticare che la destinazione è una chiave di directory, non una chiave di file.

Ecco un esempio di lavoro:

%% file="test.txt" 
    %% date >> $file 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    upload: ./test.txt to s3://bucket/test.txt/test.txt 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    %% date >> $file 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    upload: ./test.txt to s3://bucket/test.txt/test.txt 

(ora, se solo ci fosse un modo per chiedere AWS S3 per -just- convalidare il checksum, dal momento che sembra di fare sempre checksum stile più parti .. oh, forse alcuni --dryrun e alcuni output di scraping e sincronizzazione ..)

+0

la sincronizzazione funziona ora sui file? – olala

+0

non secondo i documenti - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html 'Sincronizza directory e prefissi S3' – keen

+0

dice anche:" Copia ricorsivamente file nuovi e aggiornati da la directory di origine alla destinazione ". E l'ho provato e sembra trasferire i file dal filesystem locale a S3. Quindi il trasferimento per la prima volta non significa sincronizzarli? – olala

2

È possibile farlo elencando e copiando se e solo se la lista ha esito positivo.

aws s3 ls "s3://my-bucket/production/myfile" || aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile" 

Edit: sostituito & & a || per avere l'effetto desiderato di se l'elenco non riesce, copiare

+0

mentre è vero, crea 2 chiamate a s3, con il doppio dell'opportunità di errore della richiesta, e il doppio di necessità di errore/riprova gestione ... – keen

+0

Questo fa logicamente il contrario, copia il file se questo è già lì, funzionalmente fa sempre la copia bc aws s3 ls non fallisce se il file non è lì –