サブフォルダのファイル名を変更してアップロード

サブフォルダのファイル名を変更してアップロード

ファイルを 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

これは注意する必要があります

  1. 出力を解析しませんls(「なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)「)(サイクルは循環し続ける。その他すべての情報出力ls -l(権限、所有権、タイムスタンプなど)が含まれているので、まったく動作すると言うのは奇妙だと思います。
  2. 変数を正しく引用してください(「スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?")、そして
  3. パス名を文字列ではなくエンティティとして扱います(sedなど。主にテキスト行を編集するのに役立ちます。Unixのパス名には改行文字を含めることができます(可能性は低いが許可されています)。単純なパラメータ置換を使用してファイル名のサフィックスを削除する方が安全で高速ですsedecho
  4. outファイル名がglob(シェルオプションで有効)で終わるサブディレクトリでファイルを見つけます。.html**globstar
  5. パターンが何も一致しない場合、ループは実行されません(nullglobシェルオプションを使用)。

また、値には現在のディレクトリから一致するファイル名cdまでのフルパスが含まれているため、使用する必要はありません。$pathname$newname

関連情報