2017-06-01 4 views
0

nicht finden Ich muss mit einigen Anforderungen von einem Server in S3 Anzahl von Dateien verschieben:AWS CLI-Befehl innerhalb Bash-Skript kann Datei

  • speichern Transfer Fortschritt, wenn die Verbindung
  • Bei Verbindungs ​​tropfen nächster Lauf muss weiterhin mit nicht-hochgeladenen Dateien
  • Run as Service - TODO

Also das ist, was ich habe, ist es nicht vollständig, weil ich ein Problem habe mit einer Datei suchen, wenn der Befehl ausgeführt werden aus Witz hin Skript, und doch funktioniert der Befehl, wenn er rohen Code ausführt.

Wie kann ein Skript die $ source Datei in diesem Skript finden? Gibt es auch bessere Möglichkeiten, dies zu tun?

Befehl:

aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4' 

Fehler:

script.sh: line 20: aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4': No such file or directory 

Code:

#!/bin/bash 

aws_bucket='s3://s3-public/' 
home='/home/user/' 
files='/var/www/files/' 
input="${home}videos_list.txt" 
output="${home}videos_done.txt" 

videos_list='()' 
videos_done='()' 

arrays_hydrate() { 
    mapfile -t videos_list < "$input" 
    mapfile -t videos_done < "$output" 
} 

aws_init() { 
    for index in "${!videos_list[@]}" 
    do 
     source="${videos_list[$index]}" 
     destination=$(echo "${videos_list[$index]}" | sed -e "s#^$files##") 
     length="${#source}" 

     if [ "$length" -ne "0" ]; then 
      command="aws s3 cp '${source}' '${aws_bucket}${destination}'" 

      echo "$command" 
      $("$command") & 
     fi 
    done 
} 

init() { 
    arrays_hydrate 
    aws_init 
} 

init 

exit 0 
+0

@ruakh, Frage zu Ihrem Bearbeitungsverlauf. Der Kommentar in Rev.2 war ein Fehler oder sollte dieser Beitrag etwas aufgeräumt werden? – HelpNeeder

+1

Ich habe meine Bearbeitung zurückgesetzt, weil * Teil * des Code-Dumps notwendig ist, damit die Frage Sinn ergibt. Aber Sie sollten die Frage immer noch über https://stackoverflow.com/help/mcve bearbeiten. Sie haben viel mehr Code gepostet als relevant. – ruakh

Antwort

1

Wenn der command Parameter enthält aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4' (als der Fall ist), dann das:

$("$command") & 

entspricht dies:

$("aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4'") & 

die offensichtlich nicht das, was Sie wollen: Sie haben kein Programm mit dem Namen aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4'.

Stattdessen möchten Sie die aws Programm mit den Argumenten nennen s3, cp, /var/www/files/folder/file1.mp4 und s3://s3-public/folder/file1.mp4:

command=(aws s3 cp "$source" "$aws_bucket$destination") 

echo "${command[@]}" 
"${command[@]}" & 

(wo die parameter_name=(valuevaluevaluevalue) Notation der Parameter parameter_name genannt setzt ein Array-Variable sein enthält die angegebenen Werte).

+0

Gute Nachricht, danke. Ich werde es morgen früh versuchen. – HelpNeeder

+0

Das funktioniert wie ein Zauber, danke. – HelpNeeder

Verwandte Themen