-np 는 생각보다 적게 막는다wget -r -np http://example.com/a/1.5.5/ 로 특정 버전 디렉터리만 받으려 했는데 형제 버전(1.5.1 ~ 1.5.4) 까지 따라 내려오는 일이 있다.
--no-parent(-np) 는 시작 URL 의 상위로 올라가지 않는다는 뜻일 뿐이다. 디렉터리 인덱스 페이지 안에 형제 디렉터리를 가리키는 링크가 있으면 그 링크는 그대로 따라간다. 심볼릭 링크든 일반 링크든 마찬가지다. 아파치의 자동 인덱스 페이지에는 보통 형제 목록이 그대로 들어 있다.
가장 확실한 방법은 허용 경로를 못 박는 것이다.
wget -r -np -I /a/1.5.5 http://example.com/a/1.5.5/
-I(--include-directories) 는 그 경로 아래만 허용한다. 정규식으로 더 조이려면 이렇게 한다.
wget -r -np --accept-regex '^https?://[^/]+/a/1\.5\.5/.*' http://example.com/a/1.5.5/
특정 디렉터리만 빼고 싶을 때는 반대쪽을 쓴다.
wget -r -np --reject-regex '/a/1\.5\.[1-4](/|$)' http://example.com/a/1.5.5/
wget -r -np -nH --exclude-directories=excluded_dir -P output_dir https://example.com/
--exclude-directories 는 사이트 루트 기준의 경로를 받는다. 전체 URL 을 넣으면 걸리지 않는다. 그럴 때는 --reject-regex 를 쓴다.
허용과 배제를 함께 쓸 때는 허용 목록이 먼저 걸러 내고 그 안에서 배제가 적용된다. 둘 다 쓰면 의도한 것보다 적게 받기 쉬우므로 한쪽만 쓰는 편이 낫다.
버전 디렉터리가 여러 개면 URL 을 나열하는 편이 재귀 규칙으로 씨름하는 것보다 빠르다.
cat > urls.txt <<'LIST'
http://example.com/a/1.5.1/
http://example.com/a/1.5.2/
http://example.com/a/1.5.3/
LIST
wget -r -np -i urls.txt
bash 의 중괄호 확장도 쓸 수 있다. 확장은 셸이 하는 것이므로 wget 은 각 URL 을 따로 받는다.
wget -r -np -nH --cut-dirs=1 -A '*.tar.gz' http://example.com/a/1.5.{1..5}/
| 옵션 | 의미 |
|---|---|
-nH |
호스트 이름 디렉터리를 만들지 않는다 |
--cut-dirs=N |
경로 앞 N 단계를 버리고 저장한다 |
-A · -R |
파일 이름 패턴으로 받거나 버린다 |
-P <dir> |
저장할 디렉터리를 지정한다 |
-c |
끊긴 내려받기를 이어받는다 |
--no-check-certificate |
인증서 검증을 건너뛴다. 사내 CA 는 신뢰 저장소에 넣는 편이 맞다 |
디렉터리 인덱스에 파일 크기가 적혀 있으면 로컬 파일과 대조할 수 있다.
stat -c '%n %s' *.gz *.asc | sort > local_size.txt
서명 파일(.asc) 을 함께 받았다면 크기 비교보다 서명 검증이 확실하다.
gpg --verify archive.tar.gz.asc archive.tar.gz
체크섬 파일이 있으면 그것을 쓴다.
sha256sum -c SHA256SUMS 2>&1 | grep -v ': OK$'
Windows 10 이후에는 curl.exe 가 기본으로 들어 있지만 재귀 내려받기를 지원하지 않는다. PowerShell 의 wget 은 Invoke-WebRequest 의 별칭이라 이것도 재귀가 없다. 재귀가 필요하면 wget.exe 를 따로 설치한다.
winget install --id JernejSimoncic.Wget
목록 파일을 받아 순서대로 내려받는 정도라면 기본 도구로도 된다.
Get-Content .\files.txt | ForEach-Object {
Invoke-WebRequest -Uri $_ -OutFile (Split-Path $_ -Leaf)
}