파일을 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