ファイルを S3 バケットにアップロードする前に、デプロイスクリプトを実行してファイルの .html 部分を削除します。現在、以下を使用しています。
cd out/
for file in `ls -l *.html`; do
newname=`echo $file|sed 's/\.html$//g'`
mv $file $newname
aws2 s3 cp ./$newname s3://$S3_BUCKET_NAME/
done
これはフォルダ内のファイルには効果的ですが、out/
完全に無視されますout/folder/file
。
理想的には、サブフォルダに対して同じことを行い(ファイル名の.html部分を削除し)、それをアップロードコマンドに渡すことができます。
答え1
shopt -s globstar nullglob
for pathname in out/**/*.html; do
newname=${pathname%.html}
mv "$pathname" "$newname"
aws2 s3 cp "$newname" "s3://$S3_BUCKET_NAME/"
done
これは注意する必要があります
- 出力を解析しません
ls
(「なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)「)(サイクルは循環し続ける。その他すべての情報出力ls -l
(権限、所有権、タイムスタンプなど)が含まれているので、まったく動作すると言うのは奇妙だと思います。 - 変数を正しく引用してください(「スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?")、そして
- パス名を文字列ではなくエンティティとして扱います(
sed
など。主にテキスト行を編集するのに役立ちます。Unixのパス名には改行文字を含めることができます(可能性は低いが許可されています)。単純なパラメータ置換を使用してファイル名のサフィックスを削除する方が安全で高速ですsed
。echo
out
ファイル名がglob(シェルオプションで有効)で終わるサブディレクトリでファイルを見つけます。.html
**
globstar
- パターンが何も一致しない場合、ループは実行されません(
nullglob
シェルオプションを使用)。
また、値には現在のディレクトリから一致するファイル名cd
までのフルパスが含まれているため、使用する必要はありません。$pathname
$newname