
tarコマンドの短縮オプションの個人的な覚え方
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
UNIX系のアーカイブファイルを操作するコマンドtarを使う時に、オプションで混乱しないようにTipsをまとめました。
基本的にはman tarでマニュアルを読めば問題ないです。
自分はtarを使う際に頻出する一文字のオプションコマンドの種類や順番がよくわからず混乱してました。
何も見ずにアーカイブファイルを扱えるようにオプションを整理してみました。
例: tarballを作りたい時 
tar -czf? tar -fzc? tar -xfc?
以下ではBSD版のver3.3.2の場合を取り扱います。
ベースを作る
基礎となるオプションは二種類です。 一つ目がモードを決めるオプション、二つ目が対象ファイルを決めるオプションです。 これらを決めてから追加のオプションを決めましょう。
1. 目的をはっきりさせる
tarコマンドを使う時はおそらく以下の三つの場合だと思います。
tarにはそれぞれに対応するモードがあり、次のようなオプションです。
| 目的 | オプション | 備考 | 
|---|---|---|
| アーカイブの作成 | -c | --createの省略 | 
| アーカイブの編集 | -u,-r | --update,--appendの省略 | 
| アーカイブの展開 | -x,-t | --extarct,--listの省略 | 
ここでは説明の簡略化のために触れませんが、まだ他にもオプションがあるのでman tarで確認してみてください。
アーカイブの展開の-tオプションは標準出力にアーカイブの中身の一覧を出力してくれるので、中のファイルを知りたい時に役立ちます。
2. ファイルを決める
-fオプションを追加して扱うアーカイブファイルを指定しましょう。
$ tar -r -f sample_archive.tar new_file
tarコマンドは-fオプションなしでも動きますが、指定しない場合はテープドライブを読み込もうとしてしまいます。
アーカイブファイルを扱いたい人は-fオプションを付けましょう。
追加オプション
以下では個人的によく使うオプションをまとめておきました。
これらの追加オプションは原則として-fの前に入れましょう。
取り扱ったファイルを知りたい
-v, --verboseオプションをつけると処理したファイルが順に出力されます。
意図したファイルを処理しているか確認したいときに便利です。
作成したアーカイブを圧縮したい
圧縮は-a, --auto-compressで行うことができます。これは-fで指定された対象ファイルの拡張子から自動で圧縮方式を決めてくれます。
展開する場合は自動で判別してくれるのでこのオプションは必要ありません。
自分で指定することもでき、その場合はGNU Zipなら-zなどオプションが用意されてるので確認してみてください。
短縮オプションはまとめて指定できる
他のUNIX系のコマンドでもありますが、短縮オプション(-一つから始まるアルファベット一文字のオプション)は一度に指定できます。
$ tar -czf sample_archive.tar files $ tar -c -z -f sample_archive.tar files
ただ、引数をとるような短縮オプションは連続するオプション列の最後にする必要があります。
例えば-fオプションは対象ファイルを決めるオプションで引数としてアーカイブファイルを取ります。
なので次のようなオプションの指定はできません。
$ tar -xfv sample_archive tar: Error opening archive: Failed to open 'v'
このとき-vは-fオプションの引数として理解されてしまいます。
以下のように-fを最後に持ってくると、予期した挙動になります。
$ tar -xvf sample_archive
ちなみに、以下のように-なしで指定することもできますが、これは Old Option Style と呼ばれるそうです。
$ tar xvf sample_archive
コマンド例
振り返りとしてコマンドの例をいくつか挙げておきます。
$ tar -caf sample_archive.tar.gz sample_file0 sample_file1
$ tar -xf sample_archive.zip
まとめ
- よくわからない文字列は短縮オプションの集合体
- tarにはモードがある
- ファイルが対象の時は-fオプションを最後にもってくる
参考資料
Wikipedia tar 
Old Option Style(GNU版ですがおそらくBSD系でも同じっぽい?)












