在建構 aws 指令的 for 迴圈中使用檔名的子字串作為參數

在建構 aws 指令的 for 迴圈中使用檔名的子字串作為參數

我正在嘗試使用檔案名稱中的日期作為參數將目錄中的所有檔案上傳到 s3 以建立 s3 位置。這是我到目前為止所擁有的。

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

以下是檔案「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

我想把文件放入

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

答案1

給定一個檔案“the_date=2017-05-04”,您的 for 迴圈會將變數file設為/home/ec2-user/clickparts/the_date=2017-05-04.如果從第 9 個字符中取出 4 個字符,您將得到-use,這就是您在year使用變數的地方看到的內容。

解決此問題的一種方法是考慮路徑中的字元數,並在設定年月日變數時將字元數(在本例中為 26)新增至每個起始數字。

另一種方法可能是在 for 循環之前更改為適當的目錄(並在完成後更改回來),然後您的 for 循環變為for file in t*; do,這會將您的file變數設為我認為您期望的內容。

答案2

您也可以透過basename運行它 filename="$(basename -- "$file")"

相關內容