foo.tar.gz
すべてのファイルを抽出する圧縮されたtarball(例:)がありますが、tarballのファイルは圧縮されません。つまり、コンテンツはfoo.tar.gz
圧縮されていないファイルですtxt
。
私のファイルシステムにファイルを直接抽出するのに十分なスペースがないので、これらのファイルを抽出してディスクに書き込むとすぐに圧縮したいと思います。前述したように、ファイルシステムに十分なスペースがないため、単にファイルを抽出してから抽出したファイルをgzipに圧縮することはできません。また、元のファイル名(ディレクトリを含む)がディスクに忠実に保存されていることを確認したいと思います。したがって、tarballのファイルの1つがある場合、/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 ...
。その後、ファイル名は2番目のtarコマンドに渡されます。ただそのファイルをクリックして解凍する前に、次のファイルを解凍してください。この--no-recursion
フラグは、ディレクトリを抽出しようとしたときにtarが通常行うように、そのディレクトリの下のすべてのファイルを抽出しないようにするために使用されます。
圧縮されたターボールの元のサイズよりわずかに大きいものを保存するには、まだ十分な空き容量が必要です。