알파벳순으로 tar 파일을 작성하는 방법


22

모든 디렉토리와 파일이 알파벳 순서로 처리되는 tar 파일을 만들고 싶습니다. 이것은 전체 디렉토리 계층에 대한 것이므로, 첫 번째 디렉토리를 알파벳순으로 처리 한 다음 하위 디렉토리를 알파벳순으로 처리하는 것으로 시작합니다. 맨 페이지를 살펴본 결과 스위치를 찾을 수 없습니다.

나는 반 참신, 반 약간의 최적화라는 것을 인정할 것이다. 나는 이것을 할 수있는 쉬운 방법이 없다고 믿을 수 없다. 뭔가 빠졌을 것입니다.


2
왜 이러고 싶니?
matthias krull

대부분 tar 작업이 얼마나 가까운 지 알고 싶기 때문입니다. 파일이 임의의 순서로로드 될 때 -v 플래그를 사용하여 알 수있는 방법이 없습니다.
Erick Robertson

2
그것은 전적으로 사실이 아닙니다. 출력을 파일로 파이프하고 파일 수 (빠른 찾기 명령)를 알고있는 경우 -v 출력 (wc -l)을 찾기의 파일 수와 비교하여 진행 상황을 파악할 수 있습니다.
Slartibartfast

2
@matthiaskrull 이것과 관련이없는 이유가 있는데 VMWare ESX Server에 VM을 배포하기위한 OVA 파일 (tar 파일)을 만들고 있습니다. OVA에는 특정 순서의 파일이 필요합니다 (첫 번째 파일은 OVF 등이어야합니다).
xask

1
이것의 좋은 이유도 있습니다 : 파일의 일부만 추출하고자 할 때 매우 큰 파일에서의 성능. 순서는 기본적으로 임의적이며 파일 / 디렉토리를 추출하려는 경우 순서가 빠르면 순서가 빠르면 그렇지 않은 경우 전체 아카이브를 스캔 한 후 완료된 것을 알 수 있습니다.
StormByte

답변:


12

Slartibartfast는 올바른 길에 있지만 tar의 기본 동작은 디렉토리로 내려가는 것이므로 생성 된 tar 파일에 포함 된 동일한 파일의 사본을 두 개 이상 얻을 수 있습니다. 당신은 수행하여 확인할 수 있습니다 tar tf file.tar | sort 해결 방법은 타르에 --no-재귀 옵션을 포함하는 것입니다. 또한 -print0 옵션을 사용하여 찾은 다음 --null옵션을 tar 로 사용 하여 이상한 파일 이름을 보낼 수 있어야합니다 . 최종 결과는 다음과 같습니다.

find paths -print0 | sort -z | tar cf tarfile.tar --no-recursion --null -T -

를 사용하여 tar 파일의 순서를 확인할 수 있습니다 tar tsf tarfile.tar. 줄 바꿈 문자가 포함 된 파일 이름을 발견하지 못한다면 -print0, -z 및 --null 옵션이 필요하지는 않지만 시도한 적이 없습니다.


--no-recursion 옵션 사용에 대한 훌륭한 제안. 감사합니다.
Erik

이것은 나를 위해 일한 솔루션입니다. Erick과 다른 유스 케이스가 있으며 Google이 여기로 가져 왔습니다. 원격 시스템이 완료된 상태에서 시간이 지남에 따라 스냅 샷을 수집하고 있습니다. 데이터는 매우 중복됩니다. 시간별로 tar 입력을 정렬하면 (파일 이름에 타임 스탬프가 있음) 압축기 성능이 향상됩니다. 빠른 테스트는 요인 2 (lzma2) 개선을 보여줍니다. 또한 아카이브를 파일 시스템으로 압축 해제하지 않고 tar 항목을 통해 스트림 처리를 수행합니다. 정렬 된 스트림은 디버그 출력을 훨씬 좋게 만들고 프로세스 체인에 다른 이점이 있습니다. +1
Johannes

5

tar 파일 내의 파일 순서는 실제로 중요하지 않습니다. 파일을 추출 할 때 파일 시스템은 순서를 유지하지 않기 때문입니다.

이것에 대한 스위치는 없지만 실제로 원한다면 tar에 파일 이름 목록을 정렬 된 순서로 제공 할 수 있으며 tar는 파일 순서대로 tar 파일을 만듭니다.

% tar cf tarfile tmp/diff.txt src/hellow.c junkimage.IMG barry/thegroup
% tar tf tarfile
tmp/diff.txt
src/hellow.c
junkimage.IMG
barry/thegroup

2
또는 출력을 정렬하십시오.tar tf tarfile | sort
Doug Harris

명령 줄에 파일을 모두 지정하기에는 너무 많은 파일 (20,000+)이 있습니다.
Erick Robertson

4
tar 파일 내의 파일 순서는 다운로드하는 동안 압축을 풀고 표시해야하는 경우 중요합니다.
Erik

파일 시스템에 따라 다릅니다.
Thorbjørn Ravn Andersen

4

이름에 줄 바꿈이있는 파일이 없다고 가정합니다.

find /source_directory -print | sort | tar -czf target.tgz -T -

그래도 작동하지 않으면 (시도하지 않았으므로 -T 인수의 stdin을 의미합니다) :

find /source_directory -print | sort > /tmp/temporary_file_list
tar -czf target.tgz -T /tmp/temporary_file_list

그렇다면 왜 문제가 있습니다. 그러나 때로는 묻지 않는 것이 더 쉽습니다.


2
find . -depth -print0 | sort -z | pax -wvd0 > file.tar

Pax는 cpio와 tar에 대한 POSIX의 후속 제품이며 두 가지 모두의 가장 좋은 측면을 융합합니다. tar 아카이브 (ustar)를 기본적으로 씁니다. 또한 자동 스패닝 및 미디어 프롬프트를 수행하고 완료되면 요약을 인쇄합니다.


0

@CharlieHerron의 답변에 대한 대안으로 컨텐츠 (파일, symlink) 및 폴더 메타 데이터 (예 : 폴더 권한, mtime 등)를 보존하는 데 관심이 있다면 find의 출력에서 폴더를 필터링 할 수 있습니다 .

find paths -not -type d -print 0 | sort -z | tar cf tarfile.tar --null -T -
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.