Wget - if / else 다운로드 조건?

Wget - if / else 다운로드 조건?

파일의 기본 이름이 동일한 경우 wget이 특정 파일 형식을 다른 파일 형식보다 선호하도록 하고 싶습니다.

예를 들어:

만약에foo.ogg사용 가능, 다운로드하지 않음foo.mp3


지금까지 wget을 사용하여 크롤링/자동 다운로드하는 방법(관심 있는 사람이 있는 경우):

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg,.mp3 http://www.foo.com/folder/

하지만 이것은 물론.mp3 및 .ogg를 얻습니다.파일. 어떤 아이디어가 있나요?

  • (구문 설명:
    -D: 이 도메인에서만 다운로드
    -I: 도메인의 이 하위 폴더에서만 다운로드
    -r: 재귀(링크 및 디렉터리 구조 따르기)
    -l 1: 1개의 링크만 깊게 따라가기
    -nc: 클로버 없음 = 다운로드 파일이 존재하지 않는 경우에만
    -A: 모든 *.ogg 및 *.mp3만 허용/다운로드합니다(필요한 HTML 파일 삭제)
    (-i(선택적으로 URL 앞에 있음): URL에서 URL을 읽지만 다른 항목도 다운로드합니다. 처음에 원하지 않았던 .png와 같은 파일 형식/나중에 삭제)

답변1

단일 파일

"만약 파일엑스존재한다면 다운로드하세요. 그렇지 않으면 파일을 다운로드와이", 다음을 수행할 수 있습니다.

wget x || wget y

만약에엑스존재하는 경우 다운로드되어 wget반환되므로 true두 번째 부분을 건너뜁니다. 만약에엑스존재하지 않는 경우 wget일부 오류 코드(아마도 8)를 반환하고 표현식의 두 번째 부분이 평가됩니다(다운로드됨).와이).

재귀적으로

하지만 재귀적 다운로드에는 분명히 큰 도움이 되지 않습니다. wget이 정도 수준의 정교함으로 마스킹을 수용할 수 있는 시설이 있다면 놀랄 것입니다 . 매뉴얼 페이지에는 어떤 형태의 멋진 조건도 포함되지 않는 것 같습니다. 하지만 약간 수정된 접근 방식이 효과적일 수 있습니다.

wget( 다운로드하고 싶은 항목의 목록을 생성하도록 설득하기가 어려운 것 같습니다 . 내 첫 번째 아이디어는 @utkuerd가 제안한 것처럼 이를 생성하고 다운로드하기 전에 적절하게 필터링하는 것이었습니다.)

시작점은 당연히 모든 ogg 파일을 먼저 다운로드하는 것입니다.

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

목록으로 제공할 적절한 마스크가 있는 경우 나머지 mp3 파일도 동일한 방법으로 다운로드할 수 있습니다 --reject. 이 목록에는 다운로드하고 싶지 않은 모든 mp3 파일의 이름이 포함되어야 합니다.

다음과 같이 이 목록을 생성하는 것이 좋습니다.

bl=($(find ./ -name '*.ogg' -exec basename -s .ogg {} \+ | sed 's/\(^.\+$\)/\1.mp3/' ) )

이제 차단할 mp3 파일의 bash 배열이 생겼습니다.

차단되지 않은 mp3 파일만 다운로드하려면 다음을 사용할 수 있습니다.

IFS=','; wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -R"${bl[*]}" -i http://www.foo.com/folder/; unset IFS

IFS목록이 공백으로 구분되지 않도록 변수를 수정해야 합니다 .

분명히, ogg 파일 목록이 다음보다 길거나 getconf ARG_MAX(wget 명령이 중단됨) 파일 이름에 공백이 포함되어 있는 경우(차단 목록이 중단되어 잠재적으로 사용자와 추가 파일이 제공되고 가능성은 낮음) 다양한 수준으로 심각하게 악화됩니다. 파일). 둘 다 고칠 수 있습니다.

거부 목록에 불필요한 쉼표가 있으면흥미로운결과.

@Bob의 훌륭한 제안에 대한 글

(아래 댓글 참조)

ogg 파일을 얻은 후

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.ogg -i http://www.foo.com/folder/

이렇게 더미 mp3 파일을 만들 수 있습니다

find ./ -name '*.ogg' | sed 's/ogg$/mp3/' | xargs -d '\n' touch 

-nc(exploiting ) 을 사용하여 나머지 mp3 파일을 가져옵니다.

wget -Dfoo.com -I /folder/ -r -l 1 -nc -A.mp3 -i http://www.foo.com/folder/

불필요한 mp3 파일은 다음과 같은 방법으로 제거할 수 있습니다.

find ./ -name '*.mp3' -size 0 -exec rm '{}' \+

나는 이것이 이름의 공백과 함께 작동하는지 테스트했습니다.

답변2

나는 -A 옵션이 wget의 주어진 파일 이름 패턴 중에서 현명한 방법으로 선택할 수 있는 능력을 가지고 있다고 생각하지 않습니다. 아마도 원하는 것을 달성하려면 스크립트가 필요할 것입니다. 디렉터리 목록을 가져와서 직접 구문 분석한 다음 원하는 파일을 다운로드해야 합니다.

.png 파일을 다운로드하고 삭제하는 경우 -i 플래그를 잘못 사용했습니다. -i 플래그는 다운로드할 URL이 포함된 파일(또는 URL)을 지정합니다. 플래그 없이 시작점을 지정해야 합니다. -i 플래그를 제거하면 다른 파일 형식은 다운로드되지 않고 .ogg, .mp3 및 필요한 html 파일만 다운로드됩니다. html 파일은 나중에 삭제됩니다.

관련 정보