Verwenden Sie Teilzeichenfolgen des Dateinamens als Parameter in der For-Schleife, die den AWS-Befehl erstellt

Verwenden Sie Teilzeichenfolgen des Dateinamens als Parameter in der For-Schleife, die den AWS-Befehl erstellt

Ich versuche, alle Dateien in einem Verzeichnis auf S3 hochzuladen, indem ich Daten in den Dateinamen als Parameter verwende, um die S3-Speicherorte zu erstellen. Hier ist, was ich bisher habe.

for file in /home/ec2-user/clickparts/t*; do 
    year="${file:9:4}"
    month="${file:14:2}"
    day="${file:17:2}"
    aws s3 cp "$file" s3://mybucket/json/clicks/clickpartition/$year/$month/$day/
done

Unten sehen Sie die Ausgabe für die Datei „the_date=2017-05-04“

upload: ./the_date=2017-05-04 to s3://mybucket/json/clicks/clickpartition/-use//c/ic//the_date=2017-05-04

Ich möchte die Datei in

s3://mybucket/json/clicks/clickpartition/2017/05/04/the_date=2017-05-04

Antwort1

Bei einer Datei „the_date=2017-05-04“ setzt Ihre For-Schleife die fileVariable auf /home/ec2-user/clickparts/the_date=2017-05-04. Wenn Sie 4 Zeichen vom 9. Zeichen nehmen, erhalten Sie -use, was Sie dort sehen, wo Ihre yearVariable verwendet wird.

Sie können dies beispielsweise beheben, indem Sie die Anzahl der Zeichen in Ihrem Pfad berücksichtigen und beim Festlegen Ihrer Jahres-, Monats- und Tagesvariablen die Anzahl der Zeichen (in diesem Fall 26) zu jeder der Startzahlen hinzufügen.

Eine andere Möglichkeit wäre, vor der For-Schleife in das entsprechende Verzeichnis zu wechseln (und nach Abschluss wieder zurück). Dann wird Ihre For-Schleife zu for file in t*; do, was Ihre fileVariable auf den von Ihnen erwarteten Wert setzen würde.

Antwort2

Sie können es auch über den Basisnamen ausführen filename="$(basename -- "$file")"

verwandte Informationen