2017-06-01 3 views
0

je dois déplacer plusieurs fichiers d'un serveur dans S3 avec certaines exigences:commande AWS CLI à l'intérieur script bash ne peut pas localiser le fichier

  • Enregistrer la progression du transfert en gouttes connexion
  • En cas de chute de connexion , prochaine course doit continuer avec les fichiers non téléchargés
  • Exécuter en tant que service de - TODO

Voilà donc ce que je l'ai, ce n'est pas complète, parce que je vais avoir un problème avec la localisation d'un fichier lors de la commande en cours d'exécution de l'esprit hin script, et pourtant la commande fonctionne quand on l'exécute raw.

Comment faire en sorte que le script trouve le fichier source $ dans ce script? Aussi, y a-t-il de meilleurs moyens de le faire?

Commande:

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

Erreur:

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, question sur votre historique d'édition. Le commentaire dans Rev.2 était une erreur ou devrait-il être nettoyé? – HelpNeeder

+1

J'ai annulé ma modification car * une partie * du vidage de code est nécessaire pour que la question ait un sens. Mais vous devriez toujours modifier la question par https://stackoverflow.com/help/mcve; vous avez publié beaucoup plus de code que ce qui est pertinent. – ruakh

Répondre

1

Si le paramètre command contient aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4' (comme le fait), alors ceci:

$("$command") & 

est équivalent à ceci:

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

qui est évidemment pas ce que vous voulez: vous n'avez pas un programme nommé aws s3 cp '/var/www/files/folder/file1.mp4' 's3://s3-public/folder/file1.mp4'.

, vous voulez au lieu d'appeler le programme aws avec les arguments s3, cp, /var/www/files/folder/file1.mp4 et s3://s3-public/folder/file1.mp4:

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

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

(où la notation parameter_name=(valuevaluevaluevalue) définit le paramètre nommé parameter_name être une variable tableau contenant les valeurs spécifiées).

+0

Bonne note, merci. Je vais essayer demain matin. – HelpNeeder

+0

Cela fonctionne comme un charme, merci. – HelpNeeder