디렉토리 트리를 여러 tar 아카이브로 단일 xz로 압축합니다.

디렉토리 트리를 여러 tar 아카이브로 단일 xz로 압축합니다.

rootdir다음과 같이 많은 subdir_i폴더 트리가 포함된 큰 폴더를 압축하려고 합니다 .

./rootdir
./rootdir/subdir_1
./rootdir/subdir_2
...

나는 이것을 단일 압축 아카이브로 출력하고 싶지만 각 하위 디렉토리는 자체 tar 아카이브에 있습니다.

rootdir.tar.xz  # containing:
     subdir_1.tar
     subdir_2.tar

나는 다음을 시도했습니다 :

for foo in `find rootdir -maxdepth 1 -name "subdir_*" -type d`
do
     tar --create --verbose --file=- --directory="rootdir" `basename ${foo}` 
     # in shorter form:  tar -cvf - -C rootdir subdir_i
done | xz -zc9 > rootdir.tar.xz 

하위 디렉터리를 xz로 격리하지만 내부에는 마지막 디렉터리만 포함된 tar 아카이브만 있습니다.

rootdir.tar.xz
     rootdir.tar # containing subdir_2/

그러나 이 아카이브의 크기는 전체 트리의 압축과 일치합니다 rootdir. 중간 아카이브를 사용하지 않고 내가 원하는 것을 수행하도록 하는 아이디어와 방법이 있습니까?

답변1

tar각 디렉토리에 대한 파일(예: directory-1.tar, directory-2.tar..., ) 을 생성 한 directory-n.tar다음 모든 부분을 포함하는 tar 파일을 생성하고 .zip을 통해 압축할 수 있습니다 tar Jcf whole-shebang.tar.xz directory-*.tar.

할 수 있는데 왜 합니까 tar Jcf whole-shebang.tar.xz directory-*? 물론 해당 타르볼에서 개별 디렉터리/파일을 추출할 수 있습니다. 설정에서 특정 타르볼을 먼저 추출한 다음 원하는 것을 얻으려면 그 안에서 파헤쳐야 합니다.

답변2

실제로 하는 일은 모든 타르 볼을 함께 연결하는 것입니다. tar의 스위치를 사용하여 전체 내용을 볼 수 있습니다 -i.

$ tar -itvf rootdir.tar.xz
subdir_2/
subdir_1/

나는 파이프를 통해 이러한 모든 하위 디렉토리의 타르 볼을 직접 생성하는 것이 가능하지 않다고 생각합니다. 루프에서 먼저 디스크에 작성해야 합니다.

for foo in `find rootdir -maxdepth 1 -name "subdir_*" -type d`
do
  tar --create --verbose --file=- --directory="rootdir" "$(basename ${foo})" \
  >"${foo}.tar"
done
tar -cf -  rootdir/subdir*.tar | xz -zc9 > rootdir.tar.xz
rm rootdir/subdir*.tar

관련 정보