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

この問題を解決する 1 つの方法は、パス内の文字数を考慮し、年月日変数を設定するときに各開始番号に文字数 (この場合は 26) を追加することです。

別の方法としては、 for ループの前に適切なディレクトリに変更し(そして終了したら元に戻す)、 for ループが になり、変数が期待どおりにfor file in t*; do設定されると思います。file

答え2

basenameで実行することもできます filename="$(basename -- "$file")"

関連情報