Linux ターミナルでファイルを圧縮または解凍する方法

  • ZIP ファイルは Windows、macOS、Linux システムで広く使用されており、最も一般的な形式の圧縮アーカイブとなっています。
  • Linux でファイルを圧縮(またはフォルダーを圧縮)するには、次を実行します: zip zipname files_to_be_zipped
  • ZIP からファイルを抽出するには、次を実行します: unzip zipname

ZIP ファイルは Windows、macOS、さらには Linux システムでも一般的に使用されるユニバーサル アーカイブです。一般的な Linux ターミナル コマンドを使用して、ZIP アーカイブを作成したり、ZIP アーカイブからファイルを解凍したりできます。

圧縮アーカイブ ファイル形式 ZIP

Windows の領域で ZIP 形式が優勢であるため、ZIP ファイルはおそらく世界で最も一般的な圧縮アーカイブ形式です。

Linux では .tar.gz ファイルと tar.bz2 ファイルが一般的ですが、Windows ユーザーは ZIP 形式でアーカイブを送信することがあります。また、ファイルをアーカイブして Windows ユーザーに送信する場合、ZIP 形式が誰にとっても最も簡単で最も互換性のあるソリューションになります。

zip、unzip、およびその他のユーティリティ

macOS などの Linux および Unix 系オペレーティング システムには、ZIP ファイルを作成してそこからファイルを抽出できるzipunzipというツールがあることをご存知かもしれません。しかし、zipcloakzipdetailszipsplitzipinfoなどの関連ユーティリティが多数あります。

いくつかの Linux ディストリビューションをチェックして、標準インストールにこれらのユーティリティが含まれているかどうかを確認しました。すべてのユーティリティは、Ubuntu 23.04、19.04、18.10、および 18.04 に存在していました。また、Manjaro 18.04 にも存在していました。Fedora 29 にはzipunzipが含まれていましたが、他のユーティリティは含まれておらず、CentOS でも同様でした。

Fedora 29 で不足している要素をインストールするには、次のコマンドを使用します:

sudo dnf install perl-IO-Compress

CentOS 7 で不足している要素をインストールするには、次のコマンドを使用します:

sudo yum install perl-IO-Compress

上記の Linux ディストリビューションに含まれていない zip ユーティリティがある場合は、その Linux ディストリビューションのパッケージ管理ツールを使用して、必要なパッケージをインストールします。

zip コマンドを使用して ZIP ファイルを作成する方法

ZIP ファイルを作成するには、zipにアーカイブ ファイルの名前とそれに含めるファイルの名前を指定する必要があります。アーカイブ名に「.zip」拡張子を追加する必要はありませんが、追加しても害はありません。

現在のディレクトリにあるすべての C ソース コード ファイルとヘッダー ファイルを含むsource_code.zipというファイルを作成するには、次のコマンドを使用します:

zip source_code *.c *.h

各ファイルは追加されるとリストされます。ファイルの名前と、そのファイルで達成された圧縮の量が示されます。

新しい ZIP アーカイブを見ると、zipによって「.zip」ファイル拡張子が自動的に追加されていることがわかります。

ls -l source_code.zip

ZIP ファイルの作成時にzipからの出力を表示したくない場合は、-q(quiet)オプションを使用します。

zip -q source_code *.c *.h

ZIP ファイルにディレクトリを含める

ZIP ファイルにサブディレクトリを含めるには、-r(recursive)オプションを使用して、コマンドラインにサブディレクトリの名前を含めます。以前のように ZIP ファイルを作成し、archive サブディレクトリも含めるには、このコマンドを使用します。

zip -r -q source_code archive/ *.c *.h

作成する ZIP ファイルからファイルを抽出する人に配慮するため、ZIP ファイル内のファイルがディレクトリに格納された状態で ZIP ファイルを作成することがよくあります。ZIP ファイルを受け取った人がそのファイルを抽出すると、すべてのファイルがコンピュータ上のディレクトリにきれいに配置されます。

次のコマンドでは、workディレクトリとすべてのサブディレクトリをアーカイブします。このコマンドはworkフォルダーの親ディレクトリから発行されていることに注意してください。

zip -r -q source_code work/

圧縮レベルの設定

ZIP アーカイブに追加されるファイルに適用される圧縮の量を設定できます。範囲は 0 ~ 9 で、0 は圧縮なしです。圧縮率が高いほど、ZIP ファイルの作成にかかる時間が長くなります。適度なサイズの ZIP ファイルの場合、時間差は大きなペナルティではありません。しかし、適度なサイズの ZIP ファイルの場合、デフォルトの圧縮(レベル 6)で十分でしょう。

zipで特定レベルの圧縮を使用するには、コマンドラインで「-」を付けた番号をオプションとして渡します。

zip -0 -r -q source_code work/

デフォルトの圧縮レベルは 6 です。-6オプションを指定する必要はありませんが、指定しても害はありません。

zip -r -q source_code work/

最大圧縮レベルはレベル 9 です。

zip -9 -r -q source_code work/

ここでアーカイブされているファイルとディレクトリを選択すると、圧縮なし(レベル 0)とデフォルトの圧縮(レベル 6)の差は 400K になります。デフォルトの圧縮と最高レベルの圧縮(レベル 9)の差はわずか 4K です。

大したことないように思えるかもしれませんが、何百、何千ものファイルを含むアーカイブの場合は、ファイルあたりのわずかな追加圧縮が価値のあるスペースの節約になります。

ZIP ファイルにパスワードを追加する

ZIP ファイルにパスワードを追加するのは簡単です。-e(暗号化)オプションを使用すると、パスワードの入力を求められ、確認のために再入力する必要があります。

zip -e -r -q source_code work/

unzip コマンドを使用して ZIP ファイルを解凍する方法

ZIP ファイルからファイルを抽出するには、unzip コマンドを使用し、ZIP ファイルの名前を指定します。".zip" 拡張子を指定する必要があることに注意してください。

unzip source_code.zip

ファイルが抽出されると、ターミナル ウィンドウに一覧表示されます。

ZIP ファイルにはファイルの所有権の詳細はありません。抽出されたファイルはすべて、抽出しているユーザーが所有者に設定されます。

zipと同様に、unzipには-q(quiet)オプションがあり、ファイルが抽出されるときにファイルの一覧が表示されません。

unzip -q source_code.zip

ターゲット ディレクトリへのファイルの抽出

ファイルを特定のディレクトリに抽出するには、-d(directory)オプションを使用して、アーカイブを抽出するディレクトリへのパスを指定します。

unzip -q source_code.zip -d ./development

パスワードで保護された ZIP ファイルを抽出する

ZIP ファイルがパスワードで作成されている場合、unzipはパスワードを尋ねます。正しいパスワードを入力しない場合、unzipはファイルを抽出しません。

unzip -q source_code.zip

パスワードが他の人に見られること、またはコマンド履歴に保存されることを気にしない場合は、-P(パスワード)オプションを使用してパスワードをコマンドラインで指定できます。(大文字の「P」を使用する必要があります。)

unzip -P fifty.treacle.cutlass -q source_code.zip

ファイルを除外する

特定のファイルまたはファイル グループを抽出しない場合は、-x(exclude)オプションを使用します。この例では、".h" 拡張子で終わらないすべてのファイルを抽出します。

unzip -q source_code.zip -x *.h

ファイルの上書き

アーカイブを抽出したものの、誤って抽出されたファイルの一部を削除したとします。

その場合の簡単な解決策は、ファイルをもう一度抽出することです。しかし、以前と同じディレクトリに ZIP ファイルを抽出しようとすると、unzipはファイルの上書きに関する決定を求めます。次のいずれかの応答が期待されます。

r(rename)応答を除き、これらの応答は大文字と小文字が区別されます。

  • y:はい、このファイルを上書きします
  • n:いいえ、このファイルを上書きしません
  • A:すべて、すべてのファイルを上書きします
  • N:なし、どのファイルも上書きしません
  • r:名前変更、このファイルを抽出しますが、新しい名前を付けます。新しい名前の入力を求められます。

unzipが既存のファイルをすべて上書きするようにするには、-o(上書き)オプションを使用します。

unzip -o -q source_code.zip

不足しているファイルを置き換える最も効率的な方法は、unzipがターゲット ディレクトリにないアーカイブ内のファイルのみを抽出することです。これを行うには、-n(上書きしない)オプションを使用します。

unzip -n source_code.zip

ZIP ファイルの中を見る

ZIP ファイルを抽出する前に、その中にあるファイルのリストを見ると便利で参考になります。-l(リスト アーカイブ)オプションを使用すると、これを実行できます。出力を管理しやすくするために、lessを介してパイプされます。

unzip -l source_code.zip | less

出力には、ZIP ファイル内のディレクトリとファイル、その長さ、およびアーカイブに追加された日時が表示されます。lessを終了するには、「q」を押します。

見てきたように、ZIP ファイルの中を覗く方法は他にもあり、さまざまな種類の情報が得られます。

zipcloak コマンドでパスワードを追加する

ZIP ファイルを作成したがパスワードを追加し忘れた場合、どうしたらよいでしょうか?zipcloakコマンドを使用して、ZIP ファイルにパスワードをすばやく追加できます。コマンドラインで ZIP ファイルの名前を渡します。パスワードの入力を求められます。2 回目に入力してパスワードを確認する必要があります。

zipcloak source_code.zip

zipdetails コマンドでファイルの詳細を見る

zipdetailsコマンドは、ZIP ファイルに関する多くの情報を表示します。このコマンドから得られる出力の量を処理する唯一の賢明な方法は、lessを介してパイプすることです。

zipdetails source_code.zip | less

ZIP ファイルがパスワードで保護されている場合でも、情報にはファイル名が含まれることに注意してください。このタイプの情報は、ZIP ファイル内にメタデータとして格納されており、暗号化されたデータの一部ではありません。

zipgrep コマンドでファイル内を検索する

zipgrepコマンドを使用すると、ZIP ファイル内のファイルを検索できます。次の例では、ZIP ファイル内のどのファイルに「keyval.h」というテキストが含まれているかを知りたいと考えています。

zipgrep keyval.h source_code.zip

slang.cgetval.cというファイルに「keyval.h」という文字列が含まれていることがわかります。また、ZIP ファイル内のさまざまなディレクトリにこれらのファイルの 2 つのコピーがあることもわかります。

zipinfo コマンドで情報を表示する

zipinfoコマンドは、ZIP ファイルの中を見るための別の方法を提供します。以前と同様に、出力をlessを介してパイプします。

zipinfo source_code.zip | less

出力は左から右に示されています。

  • ファイルの権限
  • ZIP ファイルの作成に使用されたツールのバージョン
  • 元のファイル サイズ
  • ファイル記述子(以下で説明)
  • 圧縮方法(この場合はデフレーション)
  • データとタイムスタンプ
  • ファイル名とディレクトリ(ある場合)

ファイル記述子は 2 文字で構成されています。1 文字目は「t」または「b」で、テキスト ファイルまたはバイナリ ファイルを示します。大文字の場合、ファイルは暗号化されています。2 文字目は 4 文字のうちの 1 つです。この文字は、このファイルに含まれるメタデータの種類を表します。なし、拡張ローカル ヘッダー、「追加フィールド」、またはその両方です。

  • -:どちらもない場合、文字はハイフンになります
  • l:拡張ローカル ヘッダーがあるが、追加フィールドがない場合
  • x:拡張ローカル ヘッダーがないが、追加フィールドがある場合
  • X:拡張ローカル ヘッダーがあり、追加フィールドがある場合

zipsplit コマンドでファイルを分割する

ZIP ファイルを他の人に送信する必要があるが、サイズ制限やファイルの送信に問題がある場合は、zipsplitコマンドを使用して元の ZIP ファイルをより小さな ZIP ファイルのセットに分割できます。

-n(サイズ)オプションを使用すると、新しい ZIP ファイルの最大サイズを設定できます。この例では、source_code.zipファイルを分割しています。新しい ZIP ファイルが 100 KB(102400 バイト)を超えないようにします。

zipsplit -n 102400 source_code.zip

選択したサイズは、ZIP ファイル内のどのファイルのサイズよりも小さくできません。

これらのコマンドを使用すると、独自の ZIP ファイルを作成したり、受信した ZIP ファイルを解凍したり、Linux ターミナルを終了することなく、さまざまな操作を実行したりできます。