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 file
Variable 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 year
Variable 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 file
Variable auf den von Ihnen erwarteten Wert setzen würde.
Antwort2
Sie können es auch über den Basisnamen ausführen
filename="$(basename -- "$file")"