하위 폴더의 파일 이름을 바꾸고 업로드

하위 폴더의 파일 이름을 바꾸고 업로드

파일을 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의 경로 이름에 대해서는 개행 문자가 포함될 수 있습니다(가능성은 낮지만 허용됨). 간단한 매개변수 대체를 사용하여 파일 이름 접미사를 제거하는 것이 더 안전하고 빠릅니다. 이 작업을 수행하려면 sed(및 )을 호출하는 것보다echo
  4. out파일 이름이 glob(셸 옵션을 통해 활성화됨)으로 끝나는 하위 디렉터리에서 파일을 찾습니다 ..html**globstar
  5. 패턴이 아무것도 일치하지 않으면 루프가 실행되지 않습니다( nullglob셸 옵션 사용).

또한 및 값에는 현재 디렉터리에서 일치하는 파일 이름 cd까지 의 전체 경로가 포함되므로 사용할 필요가 없습니다 .$pathname$newname

관련 정보