Amazon S3 정적으로 호스팅된 영역에 업로드하기 전에 Bash에서 "wget ​​--mirror"를 통해 가져온 파일 이름 바꾸기

Amazon S3 정적으로 호스팅된 영역에 업로드하기 전에 Bash에서 "wget ​​--mirror"를 통해 가져온 파일 이름 바꾸기

이전 웹 사이트를 정적으로 호스팅되는 Amazon S3 영역에 보관하고 업로드하려고 합니다.

wget다음 명령을 사용하여 내용을 가져올 수 있었습니다 .

wget --mirror --no-parent --html-extension --page-requisites http://original.com

그런 다음 다음과 같이 모든 링크를 새 URL로 바꿀 수 있습니다.

ag -l original\.com -0 | xargs -0 sed -i '' \
's|original.com|old.original.com|g'

그런 다음 s3cmd sync.

이제 내 유일한 문제는 모든 "캐시 버스트" 자산이 이제 Amazon에서 액세스가 거부된다는 점입니다. 문제는 wget파일 이름에 쿼리 매개변수가 포함된 파일을 얻었고 이름을 바꿔야 한다는 것입니다.

그래서 다음과 같이 모든 하위 폴더에서 파일 이름을 재귀적으로 바꾸고 싶습니다.

  • style.css?ver=4.2.5.css로 이름이 변경되었습니다.style.css

Bash 3.2를 사용하여 Mac OS X에서 어떻게 이를 수행할 수 있습니까?

답변1

이것은 작동합니다:

find . -maxdepth 1 -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    # mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

find .모든 작업이 현재 디렉터리와 하위 디렉터리에서 발생함을 나타냅니다. .작업 중인 파일의 전체/실제 파일 경로로 자유롭게 변경하세요 . 이름에 -name '*\?*'물음표( )가 있는 파일을 찾습니다 .?

이 초기/데모 버전도 -maxdepth"1"로 설정되어 있어 프로세스가 파일 시스템에서 제어를 벗어나지 않으며 echo실제로 실행하기 전에 명령 버전을 사용하여 수행할 작업을 보여줍니다.

출력이 좋아 보이도록 실행한 경우 자유롭게 를 다음 -maxdepth 1과 같이 조정 -maxdepth 9하거나 완전히 제거한 다음 해당 행을 주석 처리 echo하고 주석 처리를 제거하여 mv다음과 같이 보이도록 하십시오.

find . -type f -name '*\?*' |\
  while read FILENAME
  do
    IFS='?'
    SPLIT_FILENAME=(${FILENAME})
    unset IFS
    # echo mv "${FILENAME}" "${SPLIT_FILENAME}"
    mv "${FILENAME}" "${SPLIT_FILENAME}"
  done

테스트 파일 예제를 사용하여 style.css?ver=4.2.5.cssMac OS X 10.9.5(Mavericks) 시스템에서 이 스크립트를 실행할 때 다음 출력을 얻었습니다.

mv ./style.css?ver=4.2.5.css ./style.css

저에게는 좋은 스위치인 것 같습니다. 실제 mv명령으로 실행하면 파일 이름이 style.css. 이는 this is my style.css?ver=4.2.5.css및 와 같은 테스트 파일과 같이 공백이 있는 파일에서도 작동합니다 my style.css?ver=4.2.5.css.

답변2

?URL/원본 파일 이름에 하나만 있다고 가정하면 Mac OS X에서 작동합니다 .

find . -name "*\?*" -exec sh -c 'var="{}" ; mv "{}" "${var%\?*}"' \;

참고로 이는 Linux 시스템이나 도구가 설치된 모든 시스템에서도 작동합니다 rename.

find . -name "*\?*" -exec rename "s/\?.*//" "{}" \;

답변3

설명하기 위해 echo를 사용하겠습니다.

# echo 'style.css?ver=4.2.5.css' | cut -d? -f2-9999
ver=4.2.5.css

재귀:

cd <yourdir>
for f in *; do
    newf=$( echo $f | cut -d? -f2-9999 )
    mv $f $newf
done

가정: <yourdir>변경하려는 파일만 포함됩니다. 그렇지 않은 경우 for f in *글로브를 적절하게 변경하십시오. 먼저 최종 명령을 echo로 테스트해야 합니다. 즉, mv $f $newf로 바꾸고 echo $f $nf원하는 대로 작동하는지 확인해야 합니다.

관련 정보