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


407

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


6
どのgzip -r myfolderファイルを再帰的にgzipするかを使用できます。gunzip -r myfolder これを使用してファイルを解凍できるのと同じ方法で、これによりファイルが再帰的に解凍されます。詳細については、 man gzip
バレンティンバジラミ

12
使用しtarます。圧縮のオプションをサポートしています。 gziptar、代替としてではなく、を補完するものとして設計されています。
-devnull

13
@ val0x00ffの提案は、ほぼ確実に達成したいものではないことに注意してください。
シャドゥール

4
@Shadurだから、comment彼の質問に対する答えではなかったので投稿しました。
バレンティンバジラミ

2
@Shadurの意味を非難します。指定されたファイル12フォルダーの下playgroundgzip -r ./playgroundあなたを与えないだろう1.gz2.gz(これ以上と1し、2フォルダの下のファイル)playground、その中にすべてのものとしないZIPファイルを。
ジェフシャオ

回答:


660

番号。

とは異なりzipgzip圧縮アルゴリズムとしてのみ機能します。

なぜならそのうちのいくつかは、背面のテープドライブの時代に耳を傾ける様々な理由で、Unixのは、名前のプログラム使用しtarた後のような圧縮プログラムで圧縮することができ、データをアーカイブするために、gzipbzip27zip、など

ディレクトリを「zip」するには、正しいコマンドが

tar -zcvf archive.tar.gz directory/ 

これは教えてくれるtar

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

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

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

  • 出力を名前のf(ファイル)として保存しますarchive.tar.gz

このtarコマンドはgzip-z純粋に利便性のために(フラグを介して)サポートを提供します。gzipコマンド/ libには完全に別です。上記のコマンドは実質的に同じです

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

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

tar -zxvf archive.tar.gz

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

gunzip < archive.tar.gz | tar -xv

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


51
物事をさらに明確にするために、これはまさにに相当しtar -cv directory | gzip > archive.tar.gzます。結果のアーカイブは、tar -zxvfまたはで抽出できzcat file.tar.gz | tar -xvます。ポイントは、tarがgzipから完全に独立していることです。このtarコマンドには、便宜上gzipサポートが含まれています。
パトリック

私はtar cvzfかなり長い間使用しています。注意すべき点が1つ7-zipあります。指定されたWindowsを使用して*.tar.gzファイルを解凍する場合、2ラウンドかかります。1つは*.tar.gzファイルを*.tarファイルに解凍し、次はそのtarファイルを元のコンテンツに解凍します。特に大きなファイル(ログなど)の場合、解凍時間の合計が長くなります
ジェフシャオ

1
アーカイブの命名は、機械的に何かに影響しますか?元々zip圧縮に使用されていたアルゴリズム(したがって.gz)を人々に知らせるといいのですが、それ以外に実際にアーカイブの名前を指定することは重要ですか?
hello_there_andy

3
@hello_there_andyほとんどのUNIXと違いはありませんが、Windows(およびLinuxのスマートタブ補完)はファイル名拡張子に基づいて仮定を行います。
シャドゥール

1
@vadimkotovこれはあなたが探しているものかもしれません:superuser.com/questions/168749/…–
Shadur

47

この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

4

これら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を削除します。


ディレクトリ内のすべてのファイルを圧縮するには: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (findコマンドに注意して-exec echo {}最初にテストし、'。/'をキャプチャしていないことを確認してください。
アンドリューロリアン

1

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

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


私も多く使用しています(そしてpixz)が、パイプと出力のリダイレクトが機能するようになったときに機能しますか?
マイケルウルフ

1

「Linuxでzipを使用してフォルダー全体をzipできますか?」という質問に対する回答は、次の構文を使用することです。

zip -r <zip file name> <folder to zip>

新しい質問がある場合は、「質問する」ボタンをクリックして質問してください。コンテキストの提供に役立つ場合は、この質問へのリンクを含めてください。- レビューから
ジェフシャラー

2
@JeffSchaller:これは答えです。それはひどく間違っている(私は信じている)が、明らかに答えだ。
スコット

1
@ize:あなたが投稿したコマンドは、実際にはgzipを使用しないと確信しています。
-dhag

1
質問のようにzipを使用することのポイント。著者は、Windowsで行っていたのとまったく同じことを行うことが可能であることを知っている可能性が高いでしょう。ほとんどの人がこれまで考えたくないのは悲しいです。
フロリアンハイグル

2
質問で「... gusingを使用」と指定されている場合は注意が必要です。
ジェフシャラー

1

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

tar -zcvf archive.tar.gz directory/ &

0

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

tar -cvf - dir | gzip > dir.tar.gz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.