쿼리 문자열을 포함하지 않도록 wget 이름을 다운로드 한 파일로 바꾸려면 어떻게해야합니까?


32

wget이있는 사이트를 다운로드하고 있으며 많은 링크에 쿼리가 첨부되어 있으므로이 작업을 수행하면

wget -nv -c -r -H -A mp3 -nd http://url.to.old.podcasts.com/

나는 다음과 같은 많은 파일로 끝납니다.

1.mp3?foo=bar
2.mp3?blatz=pow
3.mp3?fizz=buzz

내가 끝내고 싶은 것은 :

1.mp3
2.mp3
3.mp3

이것은 모두 우분투 리눅스에서 일어나고 있으며 wget 1.10.2를 얻었습니다.

스크립트를 통해 모든 것을 가져 와서 모든 이름을 바꾼 후에이 작업을 수행 할 수 있다는 것을 알고 있습니다. 그러나 wget 내에서 솔루션을 정말로 원하므로 다운로드가 진행되는 동안 올바른 이름을 볼 수 있습니다.

누구든지 이것을 풀도록 도와 줄 수 있습니까?


www.stackoverflow.com에 질문을 게시하십시오.
Deniz Zoeteman

3
@TutorialPoint 왜? 질문은 wget-way-to-do-it-it를 찾고 있으므로 여기로 다시 마이그레이션하십시오.
quack quixote

글쎄, wget-way-to-do-it-it는 없습니다
ayrnieu

1
@ayrnieu : 하나의 명령이 아닙니다. 도우미 없이는 안됩니다. 그러나 n + 1 wget명령 만큼 적을 수도 있습니다 (작지 않은 경우).
quck quixote

답변:


24

서버가 친절하면 클라이언트에 올바른 파일 이름을 알리는 다운로드에 Content-Disposition 헤더가 붙어있을 수 있습니다. wget에게 최종 파일 이름을 위해 해당 헤더를 들으라고 말하는 것은 다음과 같이 간단합니다.

wget --content-disposition

이 기능을 사용하려면 최신 버전의 wget이 필요합니다.

파일 이름이 '/ etc / passwd'인 서버를 얼마나 잘 처리하는지 잘 모르겠습니다.


어떤 상황에서는 의심의 여지가 없으므로이 답변에는 아무런 문제가 없습니다. 불행히도, 클라우드?v=blah 버전이 제공되는 일부 페이지는 유형 버전이 지정된 페이지와 관련하여 작동하지 않았습니다 . 이것없이 문서를 요청하는 클라우드 프론트 방식이있을 수 있습니다. 모르지만 찾지 못했습니다. 따라서 다른 대답 중 하나와 같은 것이 필요할 수 있습니다. (누군가 v=문자열 을 제거하거나 Cloudfront를 제공하지 않는 방법을 알고 있다면 그것에 대해 듣고 싶습니다.)
lindes

17

큰 배치를 처리 한 후 wget쿼리 문자열을 무시하도록 지시해야한다는 것을 깨달았습니다 . 나는 그것을 다시 끝내고 싶지 않아서 나를 위해 일한이 스크립트를 만들었습니다.

# /bin/bash
for i in `find $1 -type f`
do
    mv $i `echo $i | cut -d? -f1`
done

같은 파일이 넣어 rmqstrchmod +x rmqstr 구문 :./rmqstr <directory (defaults to .)>

모든 파일 이름에서 쿼리 문자열을 재귀 적으로 제거합니다.


2
필요한 파일로만 제한하는 부분을 찾으려면 `-name " \? "`를 추가 합니다. :)
Arkadiusz 'flies'Rzadkowolski

4

나는 얻기 위해, 생각하는 wgetURL을 지정하는 것보다 파일 이름 다른 이름으로 저장하기 위해, 당신은 사용할 필요가 -O filename인수를. 여러 URL이 포함 된 단일 URL을 제공 할 때 원하는 작업 만 수행합니다 filename.

그러나 그것은 실제로 해답입니다. 하나의 wget명령으로 모든 작업을 수행하는 대신 여러 명령을 사용하십시오. 이제 워크 플로우는 다음과 같습니다.

  1. wget링크가 포함 된 기본 HTML 파일을 가져 오려면 실행하십시오 .
  2. URL 구문 분석
  3. 로 끝나는 Foreach URL mp3,
    1. 예를 들어 회전 (파일 이름을 얻기 위해 URL을 처리하기 http://foo/bar/baz.mp3?gargle=blasterbaz.mp3
    2. (선택 사항) 파일 이름이 존재하지 않는지 확인
    3. 운영 wget <URL> -O <filename>

그러면 문제가 해결되지만 이제 기본 파일을 가져 와서 mp3URL 을 찾는 방법을 알아야합니다 .

특정 사이트 / 기본 URL을 염두에두고 있습니까? 1 단계와 3 단계는 구체적인 예제로 다루기가 더 쉽습니다.


1

다운로드가 진행되는 동안 올바른 이름을 볼 수 있습니다.

승인. 평소와 같이 wget을 사용하십시오. 일반적으로 사용하는 포스트 겟 (post-wget) 스크립트를 사용하되 눈에 편하게 wget의 출력을 처리하십시오.

#! /bin/sh
exec wget --progress=bar:force $* 2>&1 | \
  perl -pe 'BEGIN { $| = 1 } s,(?<=`)([^\x27?]+),\e[36;1m$1\e[0m, if /^Saving/'
cgi-cut # rename files

?foo=bar다운로드 할 때 여전히 표시 되지만 나머지 이름은 밝은 청록색으로 표시됩니다.


이렇게하면 파일 이름이 표시되는 문제가 다소 해결되지만 OP는 최종 파일 이름에 쿼리 문자열이 없어야합니다.
Michael Mior

1

그의 코드는 항상 다음과 같은 오류 메시지를 생성했기 때문에 @Gregory Wolf와 비슷한 접근 방식이 있습니다.

mv : './file'과 './file'은 동일한 파일입니다.

따라서 파일을 이동하기 전에 파일 이름에 쿼리 문자열이 있는지 먼저 확인합니다.

for f in $(find $1 -type f); do
    if [ $f = ${f%%\?*} ]; then continue; fi
    mv "${f}" "${f%%\?*}"
done

이것은 모든 파일을 재귀 적으로 검사하고 파일 이름에서 모든 쿼리 문자열을 제거합니다 (가능한 경우).


0

사이트를 복제하기 위해 만든이 두 명령을보고 복제가 완료된 후 두 번째 명령을 실행할 수 있습니다.

두 번째 명령은 전체 복제본을 살펴보고 " ? "파일 패턴 이름을 검색 한 후 파일 이름에서 쿼리 문자열을 제거합니다.

# Clone entire site.
    wget --content-disposition --execute robots=off --recursive --no-parent --continue --no-clobber http://example.com

# Remove query string from a static resource.
for i in `find $1 -type f -name "*\?*"`; do mv $i `echo $i | cut -d? -f1`; done

( GitHub Gist 에서 참조하십시오 .)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.