web-dev-qa-db-ja.com

gzipを使用してフォルダ全体を圧縮できますか?

UNIXでフォルダを圧縮しようとしています。これはgzipコマンドを使用して実行できますか?

433
user1269502

番号。

Zipとは異なり、gzipは圧縮アルゴリズムonlyとして機能します。

さまざまな理由により、テープドライブの時代に遡る理由があるため、Unixはtarというプログラムを使用してデータをアーカイブし、gzip、_bzip2_、_7Zip_など.

ディレクトリを「Zip」するには、正しいコマンドは次のようになります。

_tar -zcvf archive.tar.gz directory/ 
_

これはtar

  • z(gzip)アルゴリズムを使用して圧縮する

  • c(作成)directory内のファイルからアーカイブを作成(tarは再帰的ですデフォルトでは)

  • v(冗長)リスト(/ dev/stderrにあるため、パイプされたコマンドには影響しません)すべてのファイルをアーカイブに追加します。

  • 出力をf(ファイル)という名前で保存します_archive.tar.gz_

tarコマンドは、単にgzipサポートを(_-z_フラグを介して)提供します。 gzipコマンド/ライブラリは完全に独立しています。上記のコマンドは事実上同じです

_tar -cv directory | gzip > archive.tar.gz
_

アーカイブを解凍して現在のディレクトリに解凍するには、次のコマンドを使用します。

_tar -zxvf archive.tar.gz
_

そのコマンドは実質的に同じです

_gunzip < archive.tar.gz | tar -xv
_

tarには他にも多くのオプションがあり、多くの用途があります。いつかそのマンページを読むことを強くお勧めします。

696
Shadur

gzipコマンドは、-rスイッチを使用する場合、ディレクトリを単一のZipファイルに再帰的に圧縮しません。むしろ、そのディレクトリ構造をウォークし、検出した各ファイルを個別のファイルに圧縮します。

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

gzipコマンドを実行します

$ gzip -r dir1

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

ディレクトリ構造を圧縮する場合は、tarコマンドを使用して、生成された.tarファイルを圧縮することをお勧めします。

$ tar zcvf dir1.tar.gz dir1/

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

これにより、次の単一ファイルが生成されます。

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

あなたはその内容を確認することができます:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3
49
slm

次の2つのコマンドをスクリプト化しました。

gzipdir

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!)使用前にテストしてください(珍しい方法で使用すると重要なデータが削除される可能性がある 'rm -f'があるため)。

使い方:

cd /home/; gzipdir MyDirectoryまたはgzipdir /home/MyDirectory

/home/MyDirectory.tgzを作成し、成功するとMyDirectoryを削除します(!!!)。

ungzipdir /home/MyDirectory.tgz

/ home/MyDirectoryを作成し、成功すると/home/MyDirectory.tgzを削除します。

5
lepe

完全を期すために、ファイルをバックグラウンドでtarする場合は、@ Shadurの回答を使用し、最後に&を追加します。

tar -zcvf archive.tar.gz directory/ &
2
shiramy

pigzGZipの並列実装)の使用をお勧めします

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz

2
nyxee

「LinuxでZipを使用してフォルダ全体をZipできますか?」という質問への回答構文を使用することです:

Zip -r <Zip file name> <folder to Zip>
2
ize

Linux tarが-zオプションをサポートしていない場合は、以下を使用できます。

tar -cvf - dir | gzip > dir.tar.gz
2
Jeff