너비 우선 검색 .tar.gz 파일이 가능합니까?

너비 우선 검색 .tar.gz 파일이 가능합니까?

다운로드하고 싶어요부분대용량(199GB) .tar.gz 파일 1개여기. 먼저 다음 명령을 사용하여 .tar.gz 파일의 모든 파일을 나열합니다.

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -tz

다음으로 다음 명령을 사용하여 .tar.gz 폴더의 내용을 다운로드해 보았습니다.

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz | tar -xz phoenix/S6/zl548/MegaDepth_v1/0000

tar하지만 명령이 깊이 우선 및 재귀적으로 아래의 각 폴더를 검색하기 때문에 시간이 너무 오래 걸립니다 phoenix/S6/zl548/MegaDepth_v1. 나는 폴더의 내용에만 관심이 있습니다 phoenix/S6/zl548/MegaDepth_v1/0000. 다른 폴더의 하위 폴더를 검색하지 않고 이 폴더의 콘텐츠를 다운로드할 수 있는 방법이 있습니까?

phoenix/S6/zl548/MegaDepth_v1/0162
phoenix/S6/zl548/MegaDepth_v1/0001
phoenix/S6/zl548/MegaDepth_v1/0132

즉, 폴더의 내용을 더 빠르게 다운로드할 수 있는 방법이 있습니까 phoenix/S6/zl548/MegaDepth_v1/0000?


위 명령에 대한 일부 참고 자료:

tar.gz에서 특정 파일을 추출하는 방법

아카이브를 디스크에 저장하지 않고 어떻게 아카이브를 다운로드하고 압축을 풀 수 있나요?

https://stackoverflow.com/q/2700306/13809128

답변1

tar파일 헤더, 파일 내용, 다음 파일 헤더, 다음 파일 내용 등을 작성합니다.

항목에는 연관된 순서가 없으며 생각할 수 있는 유일한 최적화는 파일 내용을 건너뛰고 다음 헤더를 직접 찾는 것입니다. 이렇게 하려면 찾을 수 있는 파일이 있어야 합니다.

하지만 콘텐츠가 .gz압축되어 있으므로 다음 항목으로 이동할 수 있는 확실한 방법이 없습니다.~ 해야 하다전체 파일을 읽어(다운로드) 내용을 얻으세요. 대답은 다음과 같습니다. 아니요, 전체 파일을 읽거나 다운로드하는 것을 피할 수는 없습니다.

따라서 어쨌든 완전히 다운로드해야 하므로 일단 다운로드한 다음 로컬 파일 시스템의 문제를 해결하는 것이 더 좋습니다.

답변2

tar 명령은 깊이 우선 및 재귀적으로 검색하기 때문에...

사실은 그렇지 않습니다. 하지만 사실은 그렇지 않아요찾다 별말씀을요, 대신 아카이브를 읽고 만나는 모든 파일을 살펴보고 원하는 것과 일치하는지 확인합니다. (디렉터리 트리를 순회하는 자연스러운 순서이자 파일이 아카이브에 추가되는 순서이기 때문에 깊이 우선 동작을 얻습니다.)

이는 tar 아카이브가 색인화되지 않아 검색할 수 없기 때문입니다. "tar"라는 이름은 "테이프 아카이브"를 의미하며 테이프 작업의 일반적인 모드는 탐색 없이 단일 스트림을 읽거나 쓰는 것입니다. 이 형식은 이러한 맥락에 맞게 설계되었으며 사용 사례에 가장 적합하지 않을 수 있습니다.

좋은 참고 자료를 찾을 수 없지만일부 답변웹사이트와위키피디아.

답변3

을 실행할 때마다 wget전체 tar 파일을 다운로드하려고 합니다! "초기 콘텐츠"를 여러 번 다운로드하고 출력을 stdout으로 보내 폐기했을 수 있습니다!

대신, "더 빠른" 방법은 현재 디렉터리의 ./MegaDepth_v1.tar.gz에 한 번 다운로드하고 압축을 푸는 것입니다.

wget -q -O MegaDepth_v1.tar.gz  https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz  
tar -xz -f MegaDepth_v1.tar.gz phoenix/S6/zl548/MegaDepth_v1/0000  

필요한 파일이 있으면 다운로드한 tar 파일을 삭제할 수 있습니다.

업데이트: 원본 파일 크기는 약 200GB인 것으로 보입니다. 다운로드 자체는 많은 시간과 공간을 차지합니다. 추출에는 추가 시간이 소요됩니다.지금에, 이 경우에는!
MegaDepth 팀에 연락하여 별도의 디렉터리 액세스를 요청해야 할 수도 있습니다. 그렇지 않으면 항상 속도가 느려질 것입니다.

여기서는 wget원하지 않는 콘텐츠를 건너뛸 수 있는 방법이 없으며 전체 tar 파일은 항상 처음부터 끝까지 다운로드됩니다. 또한 (ilkkach 사용자의 답변에서 언급했듯이) tarstdout 스트림을 건너뛰거나 검색할 수 있는 방법이 없습니다.

답변4

분석하다

tar압축된 아카이브를 찾을 수 있는 방법이 없다는 다른 답변에 동의합니다 . 찾고 있는 파일을 찾으려면 도구가 아무것도 건너뛰지 않고 처음부터 아카이브를 처리해야 합니다.

그러나 GNU를 사용하면 tar반드시 끝까지 진행할 필요는 없습니다. 아카이브를 생성할 때 다음 시나리오를 고려하십시오.

파일을 변경 blues한 다음 변경된 버전을 collection.tar.[...]에 추가하고 원본이 blues아카이브에 있다고 가정합니다 collection.tar. 파일을 변경하고 해당 파일의 새 버전을 아카이브에 추가하면 아카이브에 두 개의 복사본이 있게 됩니다. 아카이브를 추출하면 파일의 이전 버전이 먼저 추출된 다음 추출하는 동안 새 버전으로 대체됩니다.

(원천)

이는 특정 파일을 추출할 때 tar나중에 아카이브에 다른 복사본이 있을 수 있으므로 파일을 추출한 후에도 아카이브가 계속 처리된다는 것을 의미합니다.

하지만:

blues아카이브에서 파일의 첫 번째 항목을 추출하려면 --occurrence다음 옵션을 사용하십시오.

(같은 상기와)

찾고 있는 파일이 아카이브에 한 번만 나타나는 것이 확실하다면 파일을 추출한 후 사용을 중지하세요 tar --occurrence. tar그러면 귀하의 wget작업이 중단되고 SIGPIPE파일의 나머지 부분을 헛되이 다운로드하지 않습니다.


제한된 사용

노트이것은 당신에게 그다지 유용하지 않습니다정밀한phoenix/S6/zl548/MegaDepth_v1/0000디렉토리이기 때문 입니다(맞죠?). 를 사용하면 해당 디렉토리에 대한 다른 항목이 발견되지 않는 한 --occurrence디렉토리 추출이 tar조기에 중지되지 않습니다.그 자체. 그 이유는 phoenix/S6/zl548/MegaDepth_v1/0000/foo파일 끝에 항상 고유한 항목이 있기 때문입니다 . 디렉토리와 그 내용이 끝까지 완료되었는지 확인할 수 있는 방법은 없습니다 tar.

그러나 하나 또는 여러 개를 원할 경우디렉터리가 아닌를 사용하면 경로를 알고 있고 아카이브에 각 경로의 인스턴스가 하나만 있다는 것을 알고 있는 경우 --occurrence필요한만큼 적은 수의 아카이브를 다운로드할 수 있습니다 . 운이 좋아서 파일이 아카이브 시작 부분 근처에 있으면 --occurrence눈에 띄는 차이가 생길 것입니다.

아마도 이 답변은 별로 도움이 되지 않을 것입니다. 다음 목록을 제공할 수 있는 사용자의 경우디렉터리가 아닌.


하지 않는 한…

출력을 저장한 경우 wget -qO- … | tar -tz(전체 아카이브를 다운로드하여 처리하고 버릴 가능성이 가장 높음) 이제 다음 목록을 제공할 수 있습니다.디렉터리가 아닌--files-from=( 또는 를 사용할 수도 있습니다 --verbatim-files-from. 목록이 단일 명령줄에 비해 너무 긴 경우 특히 유용합니다). 이 경우에는 --occurrence도움이 될 수 있습니다. 또한 저장된 출력을 통해 tar -t찾고 있는 디렉터리가 아닌 각 항목이 아카이브에 한 번만 나타나는지 확인할 수 있으므로 --occurrence최신 버전을 놓치지 않을 것입니다.

위의 가정은 MegaDepth_v1.tar.gz서버에서 변경되지 않았습니다. 일반적으로(아카이브가 변경된 경우) 저장된 출력은 tar -t더 이상 유효하지 않을 수 있습니다.

추출할 디렉터리가 아닌 목록을 만들 수 있다고 가정합니다. 목록은 반드시아니요디렉터리를 명시적으로 지정하지 않으면 --occurrence도움이 되지 않습니다. tar필요한 디렉터리는 여전히 생성되지만 실제로 아카이브에서 디렉터리를 추출하기 때문이 아니라 디렉터리가 아닌 디렉터리를 디렉터리에 넣기 위한 것입니다. 즉, 디렉토리 자체의 아카이브 멤버는 중요하지 않습니다. 이는 디렉터리가 생성되지만 유사한 옵션이 --preserve-permissions해당 디렉터리에 적용되지 않음을 의미합니다.


개념의 증거

첫 번째 명령( tar -t)을 사용했는데 phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5아카이브 시작 부분 근처에 디렉터리가 없다는 것을 알았습니다. 파이프라인:

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz \
| tar -xvz phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5

파일을 추출하고 계속합니다( Ctrl+ 할 수 있음 c).

wget -qO- https://www.cs.cornell.edu/projects/megadepth/dataset/Megadepth_v1/MegaDepth_v1.tar.gz \
| tar --occurrence -xvz phoenix/S6/zl548/MegaDepth_v1/0162/dense0/depths/16384199365_2b34b42cf4_b.h5

파일을 추출하고 자동으로 종료합니다.

관련 정보