중복 생성을 중지 할 수 있습니까?


13

wget을 두 번 실행하면 해당 파일이 이미 다운로드되었음을 인식하지 못하고 새 파일을 만듭니다. 파일을 다시 다운로드하지 못하게하는 방법이 있습니까?

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png.1’
...

wget이이를 수행 할 수없는 경우 curl 또는 이와 유사한 스크립트 가능한 대안을 사용하는 것이 좋습니다.


9
파일이 있다는 것을 인식하기 때문에 새 파일을 만듭니다!
nico

답변:


17

-N옵션 을 사용하는 것이 좋습니다 .

-N
--timestamping
    Turn on time-stamping.

다운로드 한 버전보다 서버에서 최신 버전 인 경우에만 파일을 다시 다운로드하는 타임 스탬프를 활성화합니다.

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -N https://cdn.sstatic.net/askubuntu/img/logo.png
...
Server file no newer than local file ‘logo.png’ -- not retrieving.

경고 (KasiyA의 의견에서)

서버가 올바르게 구성되어 있지 않으면 항상 파일이 새 파일이라고보고하고 파일 -N을 항상 다시 다운로드합니다. 이 경우 -nc아마도 더 나은 옵션 일 것입니다.


3
서버가 올바르게 구성되지 -N않으면 wget이 항상 다시 다운로드됩니다. 그래서 때때로 -nc더 낫습니다-N
αғsнιη

1
@Kasiy 귀하의 의견에 감사드립니다, 모든 경우에 좋은 옵션이없는 것 같습니다.
jofel

16

예, -c옵션입니다.

--continue
    Continue getting a partially-downloaded file.  This is useful when you want to
    finish up a download started by a previous instance of Wget, or by another
    program.

파일이 동일하면 두 번째 다운로드 시도가 중지됩니다.

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -c https://cdn.sstatic.net/askubuntu/img/logo.png
...
The file is already fully retrieved; nothing to do.

주의 사항 (jofel의 의견)

서버에서 파일이 변경된 경우이 -c옵션은 잘못된 결과를 제공 할 수 있습니다.

-cwget을 사용 하면 wget은 이미 다운로드 한 파일의 일부 이외의 데이터를 서버에 요청합니다. 이미 다운로드 한 파일 부분에 변경 사항이 있는지 확인하지 않습니다. 따라서 이전 파일과 새 파일이 혼합 된 손상된 파일이있을 수 있습니다.


로컬 테스트

다음과 같이 간단한 로컬 웹 서버를 실행하여 테스트 할 수 있습니다 ( @roadmr답변 감사합니다 ).

터미널 창을 열고 다음을 입력하십시오.

cd /path/to/parent-download-dir/
python -m SimpleHTTPServer

이제 다른 터미널을 열고 다음을 수행하십시오.

wget -c http://localhost:8000/filename-to-download

filename-to-download에 위치하는 파일입니다 /path/to/parent-download-dir/우리가 그것을 다운로드 할.

이제 wget 명령을 여러 번 실행하면 다음을 볼 수 있습니다.

The file is already fully retrieved; nothing to do.

자, 이제 /path/to/parent-download-dir/디렉토리 로 가서 소스 파일에 무언가를 추가하십시오 (예 : 텍스트 파일 인 경우 간단한 추가 행을 추가하고 파일을 저장하십시오). 이제로 시도하십시오 wget -c .... 좋아, 이제 파일이 다시 다운로드되는 것을 볼 수 있지만 이미 파일을 다운로드 한 적이 있습니다.

이유 : 왜 다시 다운로드해야합니까?

크기가 이전 다운로드 파일보다 큰 크기로 변경 되었기 때문에 다른 것이 없습니다.


1
다운로드간에 서버에서 파일이 변경된 경우에는 올바르게 작동하지 않습니다. 최악의 경우 (파일 크기가 커짐) 파일이 손상됩니다.
jofel

1
@jofel yes -nc는 당신이 말한 것처럼하지 않지만 -c옵션이 작동하므로 -c옵션을 먼저 언급했습니다 .
αғsнιη

-c, wget이미 다운로드 한 파일의 일부를 벗어나는 데이터 서버, 아무것도 요구한다. 서버에서 파일의 이미 다운로드 된 부분에 변경 사항이 있는지 확인하지는 않습니다. 최악의 경우 이전 파일과 새 파일이 혼합 된 손상된 파일이 생성됩니다.
jofel

옵션을 검토 한 후 이것이 로그 파일 (보증 된 증분 업데이트)과 같은 경우에만 유용하다고 생각합니다. 다른 모든 경우에는 전체 파일을 처리 할 때 -N 또는 -nc가 더 적합하다고 생각합니다
david.libremone

3

또한 -ncwgetting 이라는 또 다른 옵션 이 있습니다.

--no-clobber
   If a file is downloaded more than once in the same directory, Wget's behavior
   depends on a few options, including -nc.  In certain cases, the local file will
   be clobbered, or overwritten, upon repeated download.  In other cases it will be
   preserved.

-nc옵션을 지정 wget을 동일한 파일의 복사본을 다운로드 거부합니다. wget다운로드 를 시도 하는 동일한 파일이있는 경우 로컬 파일의 이름을 바꾸거나 제거하지 않으면 다운로드가 거부됩니다.

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
...
Saving to: ‘logo.png’
...

$ wget -nc https://cdn.sstatic.net/askubuntu/img/logo.png
File ‘logo.png’ already there; not retrieving.

때로는이 옵션이 강력 하고 -nc둘 다 -c또는 옵션 대신에 옵션 을 사용하는 것이 좋습니다. -N이러한 옵션은 다운로드 파일이 동일한 이름을 가진 로컬 파일로 덮어 쓰기 때문 입니다.

경고 (jofel의 의견)

-nc가 서버에 변경된 경우 옵션은 파일을 업데이트하지 않습니다. 파일이 변경 될 것임을 알고 있으면 -N옵션이 선호됩니다. 파일이 변경되지 않는다는 것을 알고 있다면 상관 없습니다 -nc.


1

나는 이것이 wget에 관한 특정 질문이라는 것을 알고 있지만 OP는 "wget이 이것을 할 수 없다면 curl 또는 비슷한 스크립트 가능한 대안을 사용하는 것이 행복하다"고 언급했다. 여기에 요구 사항이 무엇인지 잘 모르겠습니다 (여러 파일, 원본과 다른 경우 이전 버전 유지, 새로 다운로드 한 버전으로 교체). 원하는 내용과 복제본을 처리하는 방법에 따라 이보다 더 많은 것이 필요할 수 있습니다. 원하는 것처럼 보이는 것을 수행하는 매우 간단한 방법은 단순히 curl을 사용하는 것입니다.

curl http://cdn.sstatic.net/askubuntu/img/logo.png?v=ca4d192163aa > logo.png

이 명령은 매번 이전 파일을 새로 다운로드 한 파일로 바꿉니다.

텍스트가 아닌 바이너리 파일을 다운로드하는 경우 터미널에 ""[filename] "없이 출력하지 마십시오. 그렇게하면 터미널 세션이 엉망이 될 수 있습니다. 실수로이 작업을 수행하는 경우 다른 쉘 / 터미널 세션을 열어야 할 수도 있습니다.


이진 파일을 표시하여 터미널의 모양이 좋지 않은 경우 새 터미널을 여는 것보다 프로그램을 "재설정"하는 것이 더 쉽습니다.
jofel

내 요구 사항을 취소하지 않았 음 맞아요은 행복한 결과는 내가 몇 가지 더 많은 옵션 :) 덕분에 대해 배운 것입니다
david.libremone

감사합니다 @jofel ^^ "재설정"에 대해 몰랐습니다. 나는 항상 새로운 탭을 열고이 문제가 발생했을 때 깨진 탭을 닫았습니다.
Goblinlord
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.