在构建 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")"

相关内容