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