아카이브에 저장된 파일을 효율적으로 검색하기 위해 더 스마트 한 tar 또는 cpio가 있습니까?


24

tar매우 큰 (멀티 GB) bz2파일 그룹을 아카이브하는 데 사용 하고 있습니다.

tar -tf file.tar아카이브 내의 파일을 나열하는 데 사용 하는 경우 완료하는 데 시간이 오래 걸립니다 (~ 10-15 분).

마찬가지로 cpio -t < file.cpio완료하는 데 시간이 오래 걸리고 플러스 또는 마이너스 몇 초가 걸립니다.

따라서 ( tar -xf file.tar myFileOfInterest.bz2예를 들어) 아카이브에서 파일을 검색하는 속도가 느립니다.

아카이브에 쉽게 사용할 수있는 "카탈로그"를 유지하여 아카이브 내의 개별 파일을 빠르게 검색 할 수있는 보관 방법이 있습니까?

예를 들어, 아카이브의 특정 바이트에 대한 포인터와 검색 할 파일의 크기 (다른 파일 시스템 별 세부 사항)를 저장하는 일종의 카탈로그입니다.

(또는 인수 도구 있는가 tar또는 cpio아카이브에서 파일의 효율적인 검색을 할 수 있습니다)?

답변:


15

tar (및 cpio 및 afio 및 pax 및 유사한 프로그램)는 스트림 지향 형식입니다. 테이프로 직접 스트리밍되거나 다른 프로세스로 파이프됩니다. 이론적으로는 파일 / 스트림 끝에 색인을 추가하는 것이 가능하지만 어떤 버전도 알지 못합니다 (유용한 향상 일 것입니다)

기존 tar 또는 cpio 아카이브에는 도움이되지 않지만 이러한 색인을 포함하는 아카이브 파일을 작성하고 아카이브 내의 개별 파일에 빠르게 직접 액세스 할 수있는 dar ( "디스크 아카이브") 도구가 있습니다. .

dar이 unix / linux-dist에 포함되어 있지 않으면 다음에서 찾을 수 있습니다.

http://dar.linux.free.fr/


추출을 표준 출력으로 파이프하는 방법이 있습니까? 표준 입력에서 아카이브를 만드는 방법이 있지만 표준 출력으로 추출하는 방법은 아닙니다 (적어도 직접적이지는 않습니다). 이를 수행 할 수있는 방법이 있는지 문서에서 명확하지 않습니다. 이것이 어떻게 이루어질 수 있는지 아십니까?
Alex Reynolds

1
아니, 몰라 나는 실제로 dar을 사용하지 않습니다 ... 단지 그것이 존재한다는 것을 알고 있습니다. 나는 tar에 충분히 만족하고 나중에 검색 할 큰 tar 파일의 내용을 나열하는 텍스트 파일을 만드는 경향이 있습니다. v 옵션을 두 번 사용하여 tar 아카이브를 작성하는 동시에이를 수행 할 수 있습니다 (예 : "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas

10

그러한 보관소에 SquashFS를 사용할 수 있습니다. 그것은

  • 퓨즈 드라이버를 사용하여 액세스 할 수 있도록 설계됨 (전통적인 인터페이스가 존재하더라도)
  • 압축 (블록 크기가 클수록 더 효율적)
  • 리눅스 커널에 포함
  • UID / GID 및 생성 시간 저장
  • 엔디안 인식, 따라서 매우 휴대용

내가 아는 유일한 단점은 읽기 전용이라는 것입니다.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html


8

인덱스를 저장하지 않지만 star보다 빠릅니다 tar. 또한 긴 파일 이름을 지원하고 파일 속성을 더 잘 지원합니다.

당신이 알고 있듯이, 파일을 압축 해제하는 데 시간이 걸리고 인덱스가 있어도 추출 속도에 영향을 줄 수 있습니다.

편집 :을 살펴볼 수도 있습니다 xar. 아카이브의 파일에 대한 정보가 포함 된 XML 헤더가 있습니다.

참조 페이지에서 :

Xar의 XML 헤더를 사용하면 아카이브 내에 포함 된 파일에 대한 임의의 메타 데이터를 포함 할 수 있습니다. xar는 파일 크기 및 수정 및 생성 시간과 같은 표준 유닉스 파일 메타 데이터 외에도 ext2fs 및 hfs 파일 비트, 유닉스 플래그, 확장 된 속성에 대한 참조, Mac OS X Finder 정보, Mac OS와 같은 정보를 저장할 수 있습니다 X 리소스 포크 및 파일 데이터의 해시.


내가 들어 본 적이없는 유용한 소리를 알려주는 +1
cas

링크 star가 다운되었습니다.
Pacerier

5

Thorbjørn Ravn Anderser 가 옳습니다. GNU tar는 기본적으로 "찾을 수있는"아카이브를 만듭니다. 그러나 -n 옵션이 제공되지 않으면 이러한 아카이브를 읽을 때 해당 정보를 사용하지 않습니다. -n 옵션을 사용하면 7GB를 읽고 쓰는 데 필요한 시간에 300GB 아카이브에서 7GB 파일을 추출했습니다. -n이 없으면 시간 이상이 걸리고 결과가 없습니다.

압축이 어떻게 영향을 미치는지 잘 모르겠습니다. 아카이브가 압축되지 않았습니다. 압축 된 아카이브는 현재 (1.26) GNU tar가 압축을 외부 프로그램으로 오프로드하기 때문에 "검색 가능"하지 않습니다.


tar man page man7.org/linux/man-pages/man1/tar.1.html에 따르면 GNU tar는 기본적으로 기록 할 때 탐색 가능한 형식을 사용하며 아카이브를 탐색 할 수있는 경우 읽을 때 형식을 사용합니다 ( 목록 또는 추출). GNU tar를 사용하고 있는데도 문제가 계속 발생하면 GNU에 버그 보고서를 제출해야합니다.
Brian Minton

7
설명서를 올바르게 읽으면 어떤 종류의 색인도 없으며 파일 이름이 지정된 아카이브 내의 파일로 이동할 수 없습니다. --seek는 기본 미디어를 검색 할 수 있음을 의미하므로 처음부터 읽을 때 파일 내용 읽기를 건너 뛸 수 있지만 입력 헤더를 처음부터 읽어야합니다. 즉, 1M 파일의 아카이브가 있고 --no-seek를 사용하여 마지막 파일을 추출하려고하면 모든 파일의 내용을 읽어야합니다. --seek를 사용하면 각 파일마다 하나씩 1M 헤더 만 읽으면되지만 여전히 속도가 느립니다.
icando

4

손상된 인덱스를 두 번 이상 재구성해야했기 때문에 인덱스를 저장하는 유일한 아카이브 형식은 ZIP입니다.


2

내가 아는 색인은 없지만 큰 파일로 덤프 및 복원을 사용하고 대화 형 모드에서 복원 트리를 탐색하여 임의의 파일을 선택하는 것은 매우 빠릅니다.


2

p7zip-full패키지에 액세스 할 수있는 경우 7z (7zip) 아카이브 / 압축 형식을 사용할 수 있습니다 .

Ubuntu에서이 명령을 사용하여 설치할 수 있습니다.

$ sudo apt-get install p7zip-full

사용할 수있는 아카이브를 만들고 7z a <archive_name> <file_or_directory>파일을 압축하지 않고 그대로 "저장"하려는 경우 다음 -mx0과 같은 옵션을 사용할 수 있습니다 .

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

그런 다음 다음을 사용하여 파일을 추출 할 수 있습니다 7z e.

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

또는 다음과 같이 7z l검색하기 편리한 아카이브의 색인을 나열 할 수 있습니다 grep.

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

또한 t무결성을 테스트 u하고, 파일을 아카이브에 추가 / 업데이트하고, 파일 d을 삭제하는 옵션입니다.

중요 참고
마십시오 하지 가 포함 된 파일의 소유자와 그룹을 저장하지 않는 리눅스 파일 시스템 백업의 7zip과 형식을 사용합니다.


Linux의 경우 tar 파일을 7zip으로 압축하는 것이 좋습니다.
Thorbjørn Ravn Andersen

1

나는 GNU tar가 당신이 원하는 것을 할 수 있다고 믿지만, 그렇게 말하는 확실한 자원을 찾을 수는 없습니다.

어쨌든 인덱스가있는 아카이브 형식이 필요합니다 (원하는 것을 수행 할 수 있기 때문에). ZIP 파일이 불행히도 커질 수 있다고 믿지 않습니다.


ZIP 파일은 성장할 수있는 .
Pacerier

1
설명서를 올바르게 읽으면 어떤 종류의 색인도 없으며 파일 이름이 지정된 아카이브 내의 파일로 이동할 수 없습니다. --seek는 기본 미디어를 검색 할 수 있음을 의미하므로 처음부터 읽을 때 파일 내용 읽기를 건너 뛸 수 있지만 입력 헤더를 처음부터 읽어야합니다. 즉, 1M 파일의 아카이브가 있고 --no-seek를 사용하여 마지막 파일을 추출하려고하면 모든 파일의 내용을 읽어야합니다. --seek를 사용하면 각 파일마다 하나씩 1M 헤더 만 읽으면되지만 여전히 속도가 느립니다.
icando

2
@Pacerier ZIP64 형식을 이해하면 매우 큰 파일을 사용할 수 있지만 원래 ZIP 형식은 그렇지 않습니다.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen, 단일 4GB 파일은 친구입니다.
Pacerier

3
@Pacerier 4GB는 거의 20 년 전에 DVD ISO가 등장한 이래로 크지 않았습니다. 테라 바이트는 오늘날 큰 편입니다.
oligofren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.