LoginSignup
4
2

More than 1 year has passed since last update.

アーカイブコマンドの使い方

Last updated at Posted at 2022-01-19

macOS における色々あって忘れがちなアーカイブコマンドの使い方を記しておく。

セットアップ

Homebrew で次のコマンドを使ってインストールする。

brew install \
	7-zip p7zip zip libarchive gnu-tar cpio lha gzip bzip2 xz lzip lrzip rzip lz4 lzop brotli zstd lzfse wimlib rar zpaq
  • tar/cpio について

    • gnu-tarcpio によりGNU版tar/cpioがインストールされる。 gnu-targtar としてリンクされる。 cpio はリンクされていないので、手動でリンクする。
    • libarchive によりBSD版tar/cpioがインストールされる。 bsdtar, bsdcpio コマンドがあるが共にリンクされていないので、手動でリンクする。
    • macOS には標準でBSD版が付いてくる。
  • 7-zip について

    • p7zip と 7-zip の2種類のユーティリティがあるみたい
    • ただ、それぞれでコマンドが違う
      • brew install p7zip7z コマンド
      • brew install 7-zip7zz コマンド
    • ここではバージョンがより新しく更新されている 7zz コマンドを使う。ただ、ドキュメントに関しては p7zip の方が豊富。

Debian Linux

apt install \
	zpaq gzip pigz bzip2 pbzip2 xz-utils pixz lzip plzip lrzip lz4 lzop rzip zstd brotli libarchive-tools tar zip p7zip rar cpio wimtools genisoimage

アーカイブ/圧縮

ファイル/ディレクトリから新規アーカイブを作成

zip

zip -q -r -x ".*" -x "__MACOSX" archive.zip file1.txt file2.txt ...
# 或いは
ditto -c -k --norsrc --noextattr --noqtn --noacl \
	file1.txt file2.txt ... archive.zip
  • zip ではアーカイブ内のディレクトリ構造は指定したパス通りに作ってしまうので、カレントディレクトリにないファイルをアーカイブするのであれば、そのファイルが存在するディレクトリにカレントディレクトリを移動させる必要がある
  • リソースフォークを含まないようにするため
    • zip では -x "*." -x "__MACOSX" により除外ファイルを具体的に指定
    • ditto では --norsrc --noextattr --noqtn --noacl を付加
  • zip でディレクトリをアーカイブするには -r (Recursive) オプションを付加する
  • zip で出力を抑制するために -q オプションを付加

tar

COPYFILE_DISABLE=1 tar -c -f archive.tar file1.txt file2.txt ...
  • Mac のシステムリソースを含まないようにするため COPYFILE_DISABLE 環境変数を 1 に指定する

7-zip

7zz a -ba -t7z -xr'!.*' archive.7z  file1.txt file2.txt ...
  • 7z で出力を抑制するために -ba オプションを付加
  • Mac のシステムリソースを含まないようにするため -xr'!.*' により除外ファイルを具体的に指定

rar

rar a -inul -r archive.rar file1.txt file2.txt ...

lha

lha -a -q archive.lzh file1.txt file2.txt ...
  • 出力を抑制するために -q オプションを付加

pax

COPYFILE_DISABLE=1 pax -w -f archive.pax file1.txt file2.txt ...

cpio

printf "file1.txt\0file2.txt" | cpio -o -0 -O archive.cpio

# 或いは
ditto -c    file1.txt file2.txt archive.cpio
ditto -c -z file1.txt file2.txt archive.cpio # gzip 圧縮
ditto -c -j file1.txt file2.txt archive.cpio # bzip2 圧縮
  • cpio-0 オプションを付すことで区切り文字をヌル文字にする

zpaq

zpaq a archive.zpaq file1.txt file2.txt ...

Apple Archive

# ディレクトリの場合
aa archive -d . -subdir dir -o archive.aar
# 複数ファイル/ディレクトリの場合
aa archive -d . -include-path file1.txt -include-path file2.txt -o archive.aar
  • -o で指定したアーカイブ先に既にファイルが存在している場合は新しいアーカイブとして上書きされる (他のアーカイバであればファイルの追加扱い)

ar

ar -r archive.a file1.txt file2.txt
  • -r オプションは新規アーカイブの作成の他に、ファイルの追加、ファイルのアップデートにも使用できる。つまり、既に同名のファイルがアーカイブに含まれていたら削除して新しいものを追加する。
  • -r オプションと同様の機能を持つのが -q オプションである。こちらは -r
    比べて高速である代わりに既にファイルが存在しているかは確認せず追加される。
  • -r と併せて -v オプションを使用すると日付が新しい場合のみ置き換えられる

Windows Image Format

wimcapture /path/to/dir image.wim

アーカイブに追加

zip -q -r   archive.zip  file3.txt file4.txt ...
tar -r -f   archive.tar  file3.txt file4.txt ...
7zz a -ba   archive.7z   file3.txt file4.txt ...
lha -a -q   archive.lzh  file3.txt file4.txt ...
rar a -inul archive.rar  file3.txt file4.txt ...
zpaq a      archive.zpaq file3.txt file4.txt ...
ar -r       archive.r    file3.txt file4.txt ...

printf "add file3_src.txt file3_dst.txt\nadd file4_src.txt file4_dst.txt" | wimupdate image.wim
  • tar 以外は実質同じである
  • cpio は -A オプションの付加でできる仕様だが、未実装らしい
  • wim は改行区切りの構成コマンドファイルによりファイルを書き換える

ワイルドカードによる指定

zip -q -r      archive.zip  . -i "file*.txt"
tar -c -f      archive.tar  file*.txt
7zz a -ba -t7z archive.7z   '-ir!file*.txt'
lha -a -q      archive.lzh  file*.txt
rar a -inul    archive.rar  file*.txt
zpaq a         archive.zpaq 'file*.txt'

aa archive -d . -include-regex "file.+\.txt" -o archive.aar

find . -name "file*.txt" | cpio -o -O archive.cpio
  • tar/lha はシェルの展開を使うしか手法がない
  • 7z は -ir フラグを使わなくても一応指定できる

指定の除外

zip -q -r      archive.zip  . -x 'file*.txt'
tar -c -f      archive.tar  --exclude file*.txt
7zz a -ba -t7z archive.7z   '-xr!file*.txt'
lha -a -q      archive.lzh  -x file*.txt
rar a -inul '-xfile*.txt' archive.rar
zpaq a         archive.zpaq -not 'file*.txt'

aa convert -i archive.aar -exclude-file 'file.+\.txt' -o new_archive.aar

アーカイブを標準出力に送る

zip -q -r - file.txt
tar -c -f - file.txt

printf file.txt | cpio -o

aa archive -i file.txt
  • 7z も -so フラグで出力できるみたいだが、未実装のようだ
  • /dev/stdout への出力もうまくいかない

標準入力をファイルとしてアーカイブ

printf "some" | 7zz a -t7z archive.7z -sifile.txt
  • 標準入力の内容がファイル名 file.txt としてアーカイブ中に保存される。

空のアーカイブを作成

そのようなファイルが作れて何が嬉しいのかよく分からないが、一応作れてしまう。

  • zip
mkdir _
zip -q -r archive.zip _
zip -q -d archive.zip _
rmdir _
# 22 bytes
# 任意ファイルのアーカイブを作ってそのファイルをアーカイブから削除する
  • tar
tar cf archive.tar -T /dev/null
# 1024 bytes
# 空のファイル一覧からアーカイブを作成する
  • 7-zip
mkdir _
7zz a -ba -t7z archive.7z _
7zz d -ba archive.7z _
rmdir _
# 32 bytes
# 任意ファイルのアーカイブを作ってそのファイルをアーカイブから削除する
  • cpio
printf "" | cpio -o -O archive.cpio
# 87 bytes
# 空のファイル一覧からアーカイブを作成する
  • lha
mkdir _
lha -a -q archive.lzh -x=_ _
rmdir _
# 1 byte
# ファイルを指定してアーカイブしようとして、同時にそのファイルを除外指定する
  • ar
ar -r archive.a _
# 8 bytes
# 実在しないファイルだけを指定する
  • Apple Archive
aa archive -d . -include-path _ -o archive.aar
# 12 bytes
# 実在しないファイルだけを指定する
  • Windows Image Format
mkdir _
wimcapture _ image.wim
rmdir _
# 1090 bytes
# 空のフォルダからイメージを作成する
  • rar は空のアーカイブを作ろうとしてアーカイブの中身を消すとアーカイブ自体が消えてしまうので作れない? やり方があるのなら教えてほしい。

圧縮

ファイルに保存 (元のファイルは保持)

gzip -k     file.txt # -> file.txt.gz
bzip2 -z -k file.txt # -> file.txt.bz2
xz -z -k    file.txt # -> file.txt.xz
lzma -z -k  file.txt # -> file.txt.lzma
lz4 -z -q   file.txt # -> file.txt.lz4

lzip -k       -o file.txt.lz       file.txt
lzop          -o file.txt.lzo      file.txt
lrzip -q      -o file.txt.lrz      file.txt
rzip -k       -o file.txt.rz       file.txt
brotli        -o file.txt.br       file.txt
zstd -z -q    -o file.txt.zst      file.txt
lzfse -encode -o file.txt.lzfse -i file.txt
  • aa は保存先を明示的に指定しないと標準出力される
  • 圧縮元のファイルがハードリンクの場合、 gzip, bzip2, xz, lzma では -f オプションを付ける必要がある。

ファイルに保存 (元のファイルは削除)

compress -f    file.txt # -> file.txt.Z
gzip           file.txt # -> file.txt.gz
bzip2 -z       file.txt # -> file.txt.bz2
xz -z          file.txt # -> file.txt.xz
lzma -z        file.txt # -> file.txt.lzma
lz4 -z -q --rm file.txt # -> file.txt.lz4

lzip            -o file.txt.lz   file.txt
lzop -U         -o file.txt.lzo  file.txt
lrzip -q -D     -o file.txt.lrz  file.txt
rzip            -o file.txt.rz   file.txt
brotli --rm     -o file.txt.br   file.txt
zstd -z -q --rm -o file.txt.zst  file.txt
  • compress について
    • 必ず元のファイルが消去されることに注意。
    • -f を指定しない場合、圧縮した方がファイルサイズが大きくなるようであれば、圧縮ファイルが生成されない。
    • 実質的に他の圧縮コマンドと同等の機能を実現するには後述のように標準出力に出力して、それを保存した方がよい。

標準出力に書き出し

compress -f -c   file.txt
gzip -z -k -c    file.txt
bzip2 -z -k -c   file.txt
xz -z -k -c      file.txt
lzma -z -k -c    file.txt
lz4 -z -q -c     file.txt
lzip -k -c       file.txt
lzop -c          file.txt
lrzip -q -o -    file.txt
brotli -c        file.txt
zstd -z -q -c    file.txt
lzfse -encode -i file.txt
  • rzip は標準出力に書き出すことはできない

編集

ファイル名を変更

printf "@ old_file.txt\n@=new_file.txt" | zipnote -w archive.zip
7zz rn archive.7z old_file1.txt new_file1.txt old_file2.txt new_file2.txt ...
rar rn -inul old_file1.txt new_file1.txt old_file2.txt new_file2.txt ...
printf "rename old_file.txt new_file.txt" | wimupdate image.wim
  • zipnote は ZIP ファイルのコメントを書き換えるツールであり、これを使うとファイル名までも変更できる

ファイルを削除

zip -d -q   archive.zip          file.txt
tar -f      archive.tar --delete file.txt
7zz d -ba   archive.7z           file.txt
lha -d -q   archive.lhz          file.txt
rar d -inul archive.rar          file.txt
ar -d       archive.a            file.txt

printf "delete file.txt" | wimupdate image.wim

# ワイルドカードを使う例
zip -d -q archive.zip "file*.txt"
7zz d -ba archive.7z  "file*.txt"
  • tar は GNU 版の tar でのみ有効

ファイルを新しいものに更新

zip -f -q   archive.zip  file.txt
tar -u -f   archive.tar  file.txt
7zz u -ba   archive.7z   file.txt
lha -u -q   archive.lhz  file.txt
rar u -inul archive.rar  file.txt
zpaq a -f   archive.zpaq file.txt
ar -r -u    archive.a    file.txt

printf "add file.txt" | wimupdate image.wim
  • zip で -f の代わりに -u を用いればファイルがアーカイブ内に存在していない場合に追加する。しかもアーカイブ自体が存在しない場合はアーカイブを作成する。

表示

アーカイブされたファイル名の一覧を表示

zipinfo -1 archive.zip
tar tf     archive.tar
rar lb     archive.rar
cpio -t -I archive.cpio
pax -f     archive.pax
aa list -i archive.aar
ar -t      archive.a

wimdir image.wim
  • BSD版の tar コマンドであれば、 tar だけでなく zip, 7z, cpio, pax, lha, rar にも対応し、 tar を gzip などで圧縮したものにも対応する。

ファイルの内容を詳細に表示

zipinfo -l  archive.zip
tar tf      archive.tar -v
7zz l -ba   archive.7z
lha -l -q   archive.lhz # もっと詳しくするには -l の代わりに -v を使用する
rar lt      archive.rar
cpio -tv -I archive.cpio
pax -v -f   archive.pax
zpaq l      archive.zpaq

wimdir --detailed image.wim

展開

全て展開

unzip -q      archive.zip # 或いは ditto コマンドを使用 (後述)
tar -x -f     archive.tar
7zz x         archive.7z
lha -x -q     archive.lhz
cpio -i -I    archive.cpio
pax -r -f     archive.pax
rar x -inul   archive.rar
zpaq x        archive.zpaq
ar -x         archive.a
aa extract -i archive.aar
  • BSD版の tar コマンドであれば、 tar だけでなく zip, 7z, cpio, pax, lha, rar にも対応し、 tar を gzip などで圧縮したものにも対応する。

特定のファイル/ディレクトリだけの取り出し展開

unzip -q    archive.zip  file1.txt file2.txt ...
tar -x -f   archive.tar  file1.txt file2.txt ...
7zz x       archive.7z   file1.txt file2.txt ...
lha -x -q   archive.lhz  file1.txt file2.txt ...
rar x -inul archive.rar  file1.txt file2.txt ...
zpaq x      archive.zpaq file1.txt file2.txt ...
ar -x       archive.a    file1.txt file2.txt ...

aa extract archive.aar -include-path file1.txt -include-path file2.txt ...
  • ワイルドカードを使う例
unzip -q archive.zip "file*.txt"
7zz x    archive.7z  "file*.txt"

標準出力に展開

unzip -q -p  archive.zip file.txt
tar -x -f -O archive.tar file.txt
lha -p -q    archive.lhz file.txt
ar -p        archive.a   file.txt

aar extract -i archive.aar
  • 7z ではサポートされていない

特定のディレクトリに展開

unzip -q    archive.zip   -d output_dir
ditto -x -k archive.zip      output_dir

tar -x -f   archive.tar   -C output_dir
7zz x       archive.7z     -ooutput_dir
lha -x -q   archive.lhz   -w output_dir
rar x -inul archive.rar      output_dir
zpaq x      archive.zpaq -to output_dir

aa extract -i archive.aar -d output_dir

wimapply image.wim output_dir
  • 日本語を含むファイル名のファイルは unzip ではなく ditto を使用しないと展開できないことがある。
  • zpaq-to オプションはアーカイブ時/展開時にファイル名を変更する役割がある。
  • rar では展開先ディレクトリと展開ファイルの指定がどちらもフラグなしで指定できる。指定の順番は特になく、混ぜてもよい。

解凍

ファイルに保存

uncompress -f    file.txt.Z # 元の圧縮ファイルは残らない
gzip -d -k       file.txt.gz
bzip2 -d -k      file.txt.bz2
xz -d -k         file.txt.xz
lzma -d -k       file.txt.lzma
lz4 -d -q        file.txt.lz4
lzip -d -k       file.txt.lz
lzop -d          file.txt.lzo
lrzip -d -q      file.txt.lrz

rzip -d       -o file.txt    file.txt.rz   
brotli -d -q  -o file.txt    file.txt.br   
zstd -d -q    -o file.txt    file.txt.zst  
lzfse -decode -o file.txt -i file.txt.lzfse

標準出力に書き出し

uncompress -f -c file.txt.Z
gzip -d -c       file.txt.gz
bzip2 -d -c      file.txt.bz2
xz -d -c         file.txt.xz
lzma -d -c       file.txt.lzma
lzip -d -c       file.txt.lz
lzop -d -c       file.txt.lzo
lz4 -d -q -c     file.txt.lz4
lrzip -d -q -o - file.txt.lrz
brotli -d -q -c  file.txt.br
zstd -d -q -c    file.txt.zst
lzfse -decode -i file.txt.lzfse

オプション

対応フォーマット/アルゴリズム

引数指定 デフォルト値 指定可能な値
zip -Z [method] deflate store,deflate,bzip2
tar --format [fmt] ustar cpio,pax,shar,ustar
7zz -t[fmt] 7z 7z,zip,gzip,bzip2,lzip,tar
xz -F [fmt] xz xz,lzma
lzma -F [fmt] lzma xz,lzma
lrzip [fmt] なし なし,--bzip2,--gzip,--lzo,--zpaq,--no-compress
zstd --format=[fmt] zstd zstd,gzip,xz,lzma,lz4
aa -a [algorithm] lzfse lzfse,lzma,lz4,zlib,raw

圧縮率

引数指定 デフォルト値 値の範囲
zip -[level] 6 1-9
7zz -mx=[level] 5 0,1,3,5,7,9
rar -m[level] 3 0-5
gzip -[level] 6 1-9
bzip2 -[level] 9 1-9
xz -[level] 6 0-9
lzma -[level] 6 0-9
lz4 -[level] 1 1-12
lzip -[level] 6 0-9
lzop -[level] 3 1-9
lrzip -L [level] 7 1-9
rzip -[level] 6 0-9
brotli -q [level] 11 0-11
zstd -[level] 3 1-19

tar + 圧縮 の組み合わせ

  • フラグは tar コマンドのオプションとして指定するフラグ。 tar アーカイブとまとめて圧縮も実行してくれる。
  • BSD版tar と GNU版tar でのフラグの対応状況も記す。
  • それぞれ対応した圧縮•解凍コマンドを用意していないと動作しない。
拡張子 フラグ BSD tar GNU tar
tar + compress .tar.Z --compress,-Z
tar + gzip .tgz, .tar.gz --gzip,-z
tar + bzip2 .tbz2, .tar.bz2 --bzip2, -j
tar + xz .txz, .tar.xz --xz, -J
tar + lzma .tar.lzma --lzma
tar + lzop .tzo, .tar.lzo --lzop
tar + zstd .tzst, .tar.zst --zstd
tar + lzip .tlz, .tar.lz --lzip ×
tar + lz4 .tar.lz4 --lz4 ×
tar + lrzip .tlrz, .tar.lrz --lrzip ×
tar + brotli .tbr, .tar.br - × ×
tar + rzip .tar.rz - × ×
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2