이전 웹 사이트를 정적으로 호스팅되는 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.css
Mac 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
원하는 대로 작동하는지 확인해야 합니다.