TAR과 CPIO 아카이브 파일 형식의 차이점은 무엇입니까?


41

나는 궁금하고 약간의 독서를했지만 여전히 질문이 있습니다.

CPIO가 TAR과 다른 점은 무엇입니까? 나는 tar가 많은 파일을 하나의 아카이브로 가져 와서 일반적으로 gzip 또는 bzip 파일이라고 생각합니다.

또한 TAR이 STDOUT에서 압축 할 수 없다고 들었습니다. 백업을 위해 ZFS 스냅 샷을 아카이브 / 압축하고 싶습니다. CPIO를 bzip2와 결합하여이 효과를 얻을 수 있는지 궁금합니다.

아니면 완전히 잘못된 생각이 있습니까? 이것이 CPIO의 목적이 아닙니까?

이것은 ZFS 스냅 샷 백업에 대한 Oracle 문서를 읽은 후에 나온 일종의 명령입니다.

# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2

# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2

잊지 마세요 pax: P
Janus Troelsen

답변:


28

모두 tarcpio하나의 목적을 가지고 : CONCATENATE 많은 별도의 파일을 하나의 스트림. 그들은 데이터를 압축하지 않습니다. (요즘은 tar상대적 단순성으로 인해 더 인기가있다 - 대신과 결합 될 필요의 인수로 입력 파일을 취할 수 findcpio있습니다.)

귀하의 경우 이러한 도구 중 하나가 필요하지 않습니다 . 별도의 파일 많지 않으므로 유용한 효과 가 없습니다 . zfs send이미했던 것과 같은 일을 이미 tar했습니다. 당신은하지 않아도 모든 파일 만 이름없는 스트림을.

스냅 샷을 압축하려면 압축 zfs프로그램을 통해 출력을 파이프하면 됩니다.

zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz

gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607

(당신은 대체 할 수 있습니다 gzip와 함께 xz또는 bzip2당신이 원하는 경우, 또는 기타 스트림 압축 도구입니다.)


아, ZFS 출력이 데이터 스트림이 아닌 파일입니까? 따라서 Oracle 예제가 명령에 TAR을 포함하지 않는 이유를 설명합니다.
ianc1215

1
@Solignis : 당신은 이런 식으로 생각할 수 있습니다 : zfs send이미했던 것과 같은 tar일을합니다.
grawity

62

grawityPaul 이 말한 것에 덧붙여서 :

역사

"오래된 날"에서 cpio (옵션 -c사용)는 tar 보다 이식성이 뛰어나고 유연하기 때문에 다른 UNIX 파생 파일로 파일을 이동할 때 사용 하는 도구였습니다 . 그러나 타르 이식성 문제는 1980 년대 후반부터 해결 된 것으로 간주 될 수 있습니다.

불행히도 다른 벤더들이 cpio-c형식을 엉망으로 만들었습니다 ( GNU cpio 의 매뉴얼 페이지 와 옵션 참조 ). 그 당시 tarcpio 보다 이식성이 높아 졌습니다. 다른 UNIX 공급 업체가이를 분류 할 때까지 거의 10 년이 걸렸습니다. 데 GNU 타르GNU의 CPIO 서로 다른 소스에서 테이프 처리했다 모든 관리자를위한 필수 다음 설치를 다시했다 (심지어 요즘 나는 가정).-H

사용자 인터페이스

tar 는 관리자가 시스템에 연결된 테이프 드라이브를 구성하는 테이프 구성 파일을 사용할 수 있습니다. 그런 다음 사용자는 테이프의 정확한 장치 노드를 기억할 필요없이 "테이프 드라이브 1을 사용하겠습니다"라고 말했을 것입니다. 이는 매우 혼란스럽고 다른 UNIX 플랫폼에서도 표준화되지 않았습니다.

그러나 주요 차이점은 다음과 같습니다.

tar 는 자체적으로 디렉토리를 검색 할 수 있으며 명령 행 인수에서 백업 할 파일 또는 디렉토리 목록을 가져옵니다.

cpio 는 파일이나 디렉토리에 지정된 파일 만 아카이브하지만 자체적으로 서브 디렉토리를 재귀 적으로 검색하지는 않습니다. 또한 cpiostdin 에서 아카이브 할 항목 목록을 가져옵니다. 이것이 거의 항상 find 와 함께 사용되는 이유 입니다.

CPIO의 명령은 자주와 비교하면 초보자에 무서운 보이는 타르 :

 $ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
 $ tar czvf myfiles.tar.gz myfiles

이것이 대부분의 사람들이 tar 를 사용하여 아카이브 파일을 만드는 주된 이유라고 생각 합니다. 완전한 디렉토리를 묶는 것과 같은 간단한 작업의 경우 사용하기가 더 쉽습니다.

또한 GNU tar-z아카이브를 즉석에서 GNU zip 으로 압축 할 수있게 하는 옵션 을 제공 하므로 훨씬 쉽게 작업 할 수 있습니다.

반면에 find & cpio로 멋진 작업을 수행 할 수 있습니다 . 사실 그것은 유닉스와 같은 접근법입니다. 거의 모든 사람이 생각할 수있는 도구가 이미있는 경우 디렉토리 트리 검색을 cpio에 포함시키는 이유 : find . 기억해야 할 것은 특정 날짜보다 최신 파일 만 백업하여 파일을 동일한 파일 시스템에있는 파일로 제한하거나 grep -v특정 파일을 제외 하도록 찾기 출력을 필터링하는 것입니다 .

GNU tar 사람들 은 이전에 cpio 에서만 가능했던 많은 것들을 포함시키기 위해 많은 노력을 기울 였습니다. 실제로 두 도구는 서로 배웠지 만 cpiotar 형식을 읽을 수 있습니다 .

타르 및 출력 처리

당신이 말한 것에 대한 마지막 메모 :

또한 TAR이 STDOUT에서 압축 할 수 없다고 들었습니다. 백업을 위해 ZFS 스냅 샷을 아카이브 / 압축하고 싶습니다. CPIO를 bzip2와 결합하여이 효과를 얻을 수 있는지 궁금합니다.

글쎄, 모든 버전의 tar (GNU 여부에 관계없이)를 파이프에 사용할 수 있습니다. -아카이브 이름으로 빼기 기호 ( )를 사용하십시오 .

 $ tar cvf - myfiles | bzip > myfiles.tar.bz

또한 GNU tar--to-command여전히 파이프를 선호하지만 포스트 프로세서 명령을 지정하는 옵션 을 제공합니다 . 특정 하드웨어 장치에 쓸 때 사용 중일 수 있습니다.


'STDOUT'이 아니라 'STDIN'이 아닌 'STDOUT'이 아닙니다 .. 'STDOUT'은 실제로 이해가되지 않습니다.
Joakim Elofsson

글쎄, 나는 원래의 질문만을 인용했다. Ideed-다소 잘못 해석되었지만 요점이 있다고 생각합니다.
ktf

3
"거의 모든 것을 다룰 수있는 툴이 이미 있다면 왜 디렉토리 트리 검색을 cpio에 포함 시키는가?" 좋은 질문이지만, 복사 ( cp), 이동 ( mv) diff등을 요청해야합니다 .;- )
Mecki

1
trombonehero는 말했다 : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. 당신은 말했다 : only cpio may read the format of tar. 모순이 아닙니까?
n611x007 10

6

tar와 cpio는 본질적으로 동일한 기능을 가지고 있으며, 이는 여러 파일과 디렉토리의 입력에서 하나의 연속 파일을 만드는 것입니다. 원래 이것은 테이프에 결과를 넣는 것이었지만 요즘에는 일반적으로 위와 같이 압축 유틸리티에 공급하는 데 사용됩니다. 하나의 큰 파일을 압축하면 많은 작은 파일을 압축하는 것보다 시간과 공간이 더 효율적이기 때문입니다. 많은 이미지 형식 (png, jpg 등)은 이미 고도로 압축되어 있으며 압축 유틸리티를 사용하면 실제로 약간 더 커질 수 있습니다.

tar 또는 cpio는 압축을 자체적으로 수행하지 않습니다. 타르는 "집합 파일을 만드는 데 사용할 것"전쟁을 효과적으로 "승리"했지만, cpio는 다양한 곳에서 찾아 볼 수 있습니다. 나는 다른 것보다 하나의 이점을 알지 못하고, tar는 더 일반적으로 사용되어 승리합니다.

tar는 실제로 stdin에 입력을 받고 stdout에 출력 할 수 있습니다. 그런 다음 여러분이 가지고있는 것과 같이 bzip2로 파이프 될 것입니다. "z"옵션으로 호출하면 출력에서 ​​자동으로 gzip을 호출합니다.


1
예, -jbzip2를 호출 하지 않습니까?
ianc1215

2
예, -j는 bzip2이고 일부 (더 분개?) 버전은
Joakim Elofsson

4
-a 옵션을 사용하면 최신 버전의 GNU tar도 아카이브 파일 이름에서 원하는 압축 형식을 추측 할 수 있습니다. 이 그래서 : tar -caf myfiles.tar.xz myfiles/사용하여 압축됩니다 xz이것은 tar -caf myfiles.tar.gz myfiles/사용하여 압축됩니다 gzip.
gerlos

5

캘리포니아에서 HP 기술 지원을 요청했습니다. 1996 년 cpio이상 사용 하는 이유 tar.

나는 테이프가 늘어나고 마모된다고 들었습니다. 때 tar테이프의 읽을 수없는 부분에 도달이 실패하고 오류 번호를 반환합니다. 경우 cpio읽을 부 도달 그 다음 판독 블록 resyncs 계속 계속된다.

나는 이것을 지원하는 문서를 본 적이 없지만 항상 사용했다 cpio.


게시물에 따르면 tar의 비트 손상은 cpio에 대해 말한 것과 같이 영향을받는 영역 / 파일에 현지화 된 것으로 보입니다. oxfordrepo.blogspot.tw/2008/12/archive-file-resiliences.html
okwap

4

또한 주목할 가치가 있습니다 : FreeBSD와 Mac OS X에서 (적어도) tar를 사용하여 cpio 파일을 조작 할 수 있습니다. BSD tar는 후드 아래에서 libarchive를 사용하므로 cpio, pax, shar ...

이것은 cpio명령 의 유용성 문제 가 cpio 파일과의 상호 작용을 막을 필요가 없다는 것을 의미 합니다.


ktf 말했다 : only cpio may read the format of tar. 당신은 말했다 : BSD tar uses libarchive under the hood, so it can handle cpio, pax, shar. 모순이 아닙니까?
n611x007 10

1
@ n611x007이 답변은 BSD tar에 대해 이야기합니다. 다른 하나는 아마도 GNU tar에 관한 것입니다. 그들은 다른 프로그램입니다.
Navin

3

여기에 대한 답변은 이미 비교 cpio하고 tar잘 설명하지만 cpio파이프 라인 모드라는 기능 중 하나를 강조 표시 find하여 디렉토리 구조를 유지하면서 선택적 파일 (예 : via 및 filter) 을 복사하는 것이 더 효율적 입니다. 이 기능은 잘 문서화 되어 있으며 기본 전제는 다음과 같습니다.

find . <predicates> | cpio -pdmv /destination/dir

와 동등한 tar것은 다음과 같습니다.

find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)

이 같은 물론 다른 대안의이다 rsynccp --parents에서 논의 된 다른 스레드 ,하지만 아무것도의 조합이 제공하는 유연성에 가까이 온다 findcpio. 로 tar아카이브를 만들기위한 유비쿼터스되고, 이것은 아직도 사용하는 유일한 이유입니다 cpio.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.