UNIXでフォルダを圧縮しようとしています。これはgzipコマンドを使用して実行できますか?
番号。
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
には他にも多くのオプションがあり、多くの用途があります。いつかそのマンページを読むことを強くお勧めします。
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
次の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を削除します。
完全を期すために、ファイルをバックグラウンドでtarする場合は、@ Shadurの回答を使用し、最後に&
を追加します。
tar -zcvf archive.tar.gz directory/ &
pigz
(GZipの並列実装)の使用をお勧めします
tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz
「LinuxでZipを使用してフォルダ全体をZipできますか?」という質問への回答構文を使用することです:
Zip -r <Zip file name> <folder to Zip>
Linux tarが-z
オプションをサポートしていない場合は、以下を使用できます。
tar -cvf - dir | gzip > dir.tar.gz