foo.tar.gz
모든 파일을 추출하려는 압축된 tarball(예: )이 있지만 tarball의 파일은 압축되지 않습니다. 즉, 콘텐츠는 foo.tar.gz
압축되지 않은 파일입니다 txt
.
내 파일 시스템에 파일을 직접 추출할 충분한 공간이 없기 때문에 이러한 파일을 추출하고 디스크에 기록되자마자 압축하고 싶습니다. 앞서 말했듯이 파일 시스템에 공간이 충분하지 않기 때문에 단순히 파일을 추출한 다음 추출된 파일을 gzip으로 압축할 수는 없습니다. 또한 원본 파일 이름(디렉터리 포함)이 디스크에 충실하게 보존되는지 확인하고 싶습니다. 따라서 tarball의 파일 중 하나가 이면 /a/b/c/foo.txt
프로세스가 끝나면 원하는/a/b/c/foo.txt.gz
어떻게 해야 하나요?
답변1
특히 파일이 많은 대형 타르볼의 경우 속도가 매우 빠르지는 않지만 bash에서는 다음을 수행할 수 있습니다.
tar -tzf tarball.tgz | while IFS= read -r file; do
tar --no-recursion -xzf tarball.tgz -- "$file"
gzip -- "$file"
done
첫 번째 tar 명령은 tarball에서 파일 이름을 추출하고 이 이름을 루프에 전달합니다 while read ...
. 그런 다음 파일 이름은 두 번째 tar 명령으로 전달됩니다.그냥 그 파일를 클릭한 다음 압축을 풀기 전에 다음 파일을 압축하세요. 이 --no-recursion
플래그는 디렉토리를 추출하려고 시도할 때 tar가 일반적으로 수행하는 것처럼 해당 디렉토리 아래의 모든 파일을 추출하지 않도록 하기 위해 사용됩니다.
압축된 타르볼의 원래 크기보다 약간 더 큰 것을 저장하려면 여전히 충분한 여유 공간이 필요합니다.