今回は、Linuxシステム管理における基本ツールでありながら、その潜在能力が十分に活用されていないtarコマンドについて深掘りしていきます。
日常的にLinuxを扱うエンジニアであれば、tarの基本的な使い方は熟知しているでしょうが、普段あまり使わない効率的な活用方法については案外知られていないことが多いものです。本記事では特に複数ファイルの効率的な圧縮方法や特定ファイルだけを解凍する高度なテクニックを中心に解説していきます。
tarコマンドの基本を再確認
まず簡単におさらいしておくと、tarコマンド(Tape ARchive)は元々磁気テープへのバックアップ用に開発されましたが、現在ではファイルのアーカイブや圧縮に広く使用されています。基本的な構文は以下の通りです:
tar [オプション] [アーカイブ名] [ファイル/ディレクトリ名]
よく使われる基本オプションには次のようなものがあります:
– c:新しいアーカイブを作成
– x:アーカイブから抽出
– f:アーカイブのファイル名を指定
– v:詳細な処理内容を表示
– z:gzipで圧縮/解凍
– j:bzip2で圧縮/解凍
しかし、本当の力はこれだけではありません。ここからはより高度な使い方を見ていきましょう。
複数ファイルを効率的に圧縮する高度なテクニック
### 複数の異なるディレクトリからファイルを集めて圧縮
異なる場所に存在するファイルを単一のアーカイブにまとめたい場合、多くのエンジニアは複数のステップで行うか、一時ディレクトリを作成しています。しかし、tarでは一度のコマンドでこれを実現できます:
tar -czf archive.tar.gz -C /path/to/dir1 file1 -C /path/to/dir2 file2 -C /path/to/dir3 file3
このコマンドでは、`-C`オプションでディレクトリを切り替えながら各ファイルを追加していきます。これにより、異なるディレクトリ構造から必要なファイルだけを効率的に収集できます。
### ワイルドカードと除外パターンの組み合わせ
特定のパターンのファイルを含めつつ、別のパターンのファイルを除外したい場合は以下のように指定できます:
tar -czf backup.tar.gz --exclude="*.log" --exclude="cache/*" --exclude-vcs /var/www/html/
このコマンドは`/var/www/html/`ディレクトリをアーカイブしますが、すべての`.log`ファイル、`cache`ディレクトリの内容、およびバージョン管理システムのディレクトリ(`.git`など)を除外します。`–exclude-vcs`は特にプロジェクトのバックアップを取る際に非常に便利です。
### インクリメンタルバックアップを作成する
あまり知られていない機能の一つに、tarを使ったインクリメンタルバックアップがあります:
tar --create --file=backup-full.tar --listed-incremental=snapshot.file /path/to/data
# 後日、変更されたファイルのみを含む増分バックアップを作成
tar --create --file=backup-inc.tar --listed-incremental=snapshot.file /path/to/data
`–listed-incremental`オプションを使用すると、前回のバックアップ以降に変更されたファイルのみをアーカイブします。これにより、大規模なデータセットでもバックアップ時間とストレージを大幅に節約できます。
特定のファイルだけを解凍する優れたテクニック
### アーカイブの内容を確認せずにファイル名を指定して抽出
アーカイブから特定のファイルだけを抽出したい場合、まず内容を確認してからファイル名を指定するのが一般的ですが、直接パスを指定して抽出することも可能です:
tar -xf archive.tar.gz path/to/extract/file.txt
パス名が完全に一致する場合のみそのファイルが抽出されます。複数のファイルを指定することもできます:
tar -xf archive.tar.gz file1.txt file2.txt dir/file3.txt
### ワイルドカードを使用した選択的抽出
特定のパターンに一致するファイルだけを抽出したい場合は、`–wildcards`オプションを使用します:
tar -xf archive.tar.gz --wildcards "*.conf"
このコマンドはアーカイブ内のすべての`.conf`ファイルを抽出します。より複雑なパターンも指定可能です:
tar -xf archive.tar.gz --wildcards --no-anchored "log/*.log"
`–no-anchored`オプションを追加することで、パスの任意の場所でパターンにマッチするファイルを抽出できます。
### 特定のディレクトリ内のファイルのみを抽出
アーカイブ内の特定のディレクトリだけを抽出したい場合:
tar -xf archive.tar.gz --strip-components=2 path/to/directory/
`–strip-components=2`オプションは、抽出時に指定した数のディレクトリレベルを無視します。これにより、深いディレクトリ構造の一部だけを抽出する際に、不要な親ディレクトリを省略できます。
パフォーマンスを向上させるための隠れた技
### マルチコアを活用した高速圧縮
大きなアーカイブを作成する場合、圧縮処理はCPU負荷が高く時間がかかります。pigzを使用して並列処理することで、マルチコアCPUの能力を最大限に活用できます:
tar -cf - /path/to/directory | pigz -9 > archive.tar.gz
このコマンドはtarでアーカイブを作成し、その出力をpigzに渡して並列圧縮します。`-9`は最高の圧縮レベルを指定しています。システムに負荷がかかりすぎる場合は、`-p 4`のようにスレッド数を制限することも可能です。
### 進捗状況を表示する
大きなアーカイブを作成または抽出する際に、進捗状況を確認したい場合は、pvコマンドと組み合わせることができます:
tar -cf - /large/directory | pv -s $(du -sb /large/directory | awk '{print $1}') | gzip > large_archive.tar.gz
これにより、処理の進行状況、転送速度、残り時間の見積もりが表示されます。長時間実行されるバックアップ作業では特に便利です。
セキュリティを強化するtarの使い方
### アーカイブの暗号化
重要なデータをアーカイブする場合、GPGで暗号化することができます:
tar -czf - /sensitive/data | gpg -c > encrypted_archive.tar.gz.gpg
# 解凍時
gpg -d encrypted_archive.tar.gz.gpg | tar -xz
`-c`オプションは対称暗号化を使用し、パスワードを要求します。より高度なセキュリティが必要な場合は、公開鍵暗号化も利用可能です。
### 権限を保持した完全なバックアップ
システムバックアップでは、所有権や特殊な権限を正確に保持することが重要です:
sudo tar --acls --xattrs --selinux -czpf system_backup.tar.gz /etc /var/www
`–acls`、`–xattrs`、`–selinux`オプションはそれぞれACL、拡張属性、SELinuxコンテキストを保持します。`-p`オプションはパーミッションを保持します。これにより、復元時に元のセキュリティコンテキストが完全に復元されます。
スクリプトやパイプラインでの活用法
### 特定の日付以降に変更されたファイルのみをアーカイブ
findコマンドと組み合わせることで、特定の日付以降に変更されたファイルだけをアーカイブできます:
find /path/to/search -type f -newermt "2023-01-01" -print0 | tar -czf recent_changes.tar.gz --null -T -
このコマンドは2023年1月1日以降に変更されたすべてのファイルをアーカイブします。`-print0`と`–null`オプションを使用することで、スペースを含むファイル名も安全に処理できます。
### アーカイブの内容を変更せずに確認
アーカイブの内容を抽出せずに確認したい場合:
tar -tf archive.tar.gz | grep "search_pattern"
これにより、アーカイブ内の全ファイルリストが表示され、grepで特定のパターンをフィルタリングできます。さらに詳細な情報が必要な場合は:
tar -tvf archive.tar.gz
このコマンドはファイルサイズ、所有者、パーミッション、修正日時なども表示します。
tarのオプション一覧表(付録)
オプション | 説明 | 使用例 |
---|---|---|
-c, –create | 新しいアーカイブを作成 | tar -cf archive.tar files/ |
-x, –extract | アーカイブからファイルを抽出 | tar -xf archive.tar |
-t, –list | アーカイブの内容を一覧表示 | tar -tf archive.tar |
-f, –file=ARCHIVE | アーカイブファイル名を指定(必須) | tar -cf archive.tar files/ |
-v, –verbose | 処理されるファイルを詳細に表示 | tar -cvf archive.tar files/ |
-z, –gzip | gzipでの圧縮/解凍を行う | tar -czf archive.tar.gz files/ |
-j, –bzip2 | bzip2での圧縮/解凍を行う | tar -cjf archive.tar.bz2 files/ |
-J, –xz | xzでの圧縮/解凍を行う | tar -cJf archive.tar.xz files/ |
–zstd | zstdでの圧縮/解凍を行う | tar –zstd -cf archive.tar.zst files/ |
-a, –auto-compress | ファイル拡張子から圧縮形式を自動判断 | tar -caf archive.tar.gz files/ |
-p, –preserve-permissions | 元のファイルのパーミッションを保持 | tar -cpf archive.tar files/ |
–exclude=PATTERN | 指定パターンのファイルを除外 | tar -cf archive.tar –exclude=”*.log” files/ |
–exclude-vcs | VCSディレクトリ(.git, .svnなど)を除外 | tar -cf archive.tar –exclude-vcs project/ |
-C, –directory=DIR | 指定ディレクトリに移動してから操作 | tar -cf archive.tar -C /other/dir files/ |
–strip-components=N | 抽出時にN階層のディレクトリを無視 | tar -xf archive.tar –strip-components=1 |
–wildcards | ワイルドカードを使用可能に | tar -xf archive.tar –wildcards “*.txt” |
–listed-incremental=FILE | インクリメンタルバックアップを実行 | tar -cf inc.tar –listed-incremental=snap files/ |
–append | 既存アーカイブにファイルを追加 | tar –append -f archive.tar newfile |
–update | アーカイブ内よりも新しいファイルのみ追加 | tar –update -f archive.tar changedfile |
–delete | アーカイブからファイルを削除 | tar –delete -f archive.tar file_to_remove |
–acls | ACLを保持 | tar –acls -cpf archive.tar files/ |
–xattrs | 拡張属性を保持 | tar –xattrs -cpf archive.tar files/ |
–selinux | SELinuxコンテキストを保持 | tar –selinux -cpf archive.tar files/ |
–sparse | スパースファイルを効率的に処理 | tar –sparse -cf archive.tar large_sparse_file |
–totals | 処理された総バイト数を表示 | tar -cf archive.tar files/ –totals |
–checkpoint | 処理中に定期的な進捗報告 | tar -cf archive.tar –checkpoint=1000 files/ |
–one-file-system | 他のファイルシステムにまたがらない | tar -cf backup.tar –one-file-system / |
まとめ
tarコマンドはRHELの運用構築案件に携わっていれば、よく扱うコマンドですが、あまり知られていない機能を理解し活用することで、日々のシステム管理業務を大幅に効率化できます。この記事で紹介した複数ファイルの効率的な圧縮方法、特定ファイルだけを選択的に解凍するテクニック、特に、インクリメンタルバックアップや圧縮処理の並列化、セキュリティを考慮したアーカイブ作成などは、大規模なシステム管理やバックアップ戦略を立てる際に非常に有用です。
これらの高度なテクニックを日常的なワークフローに取り入れることで、より効率的で堅牢なシステム運用が可能になりますので、是非うまく活用して頂ければ幸いです。
コメント