【RHEL】tarコマンドの効率的な使い方例とコマンドオプション

RHEL

今回は、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の運用構築案件に携わっていれば、よく扱うコマンドですが、あまり知られていない機能を理解し活用することで、日々のシステム管理業務を大幅に効率化できます。この記事で紹介した複数ファイルの効率的な圧縮方法、特定ファイルだけを選択的に解凍するテクニック、特に、インクリメンタルバックアップや圧縮処理の並列化、セキュリティを考慮したアーカイブ作成などは、大規模なシステム管理やバックアップ戦略を立てる際に非常に有用です。

これらの高度なテクニックを日常的なワークフローに取り入れることで、より効率的で堅牢なシステム運用が可能になりますので、是非うまく活用して頂ければ幸いです。

【注意】

このブログは技術に関する知識や経験を共有することを目的としており、情報の正確性に努めていますが、その内容の正確性や完全性を保証するものではありません。ブログの情報を利用する場合は、自己の責任において行動してください。ブログの内容に基づいて行った行動や決定によって生じた損害や被害について、筆者は一切の責任を負いません。

 

記事の内容の一部は、生成AIで作成しています。

RHEL
この記事の作者
StarTeller

30歳で異業種からITエンジニアへ転身し、10年以上にわたりインフラエンジニアとして様々な現場でシステム構築・運用に携わってきました。

得意分野はLinux/Windowsのサーバー構築・運用で、ネットワークやAWSなども実務で活用しています。

このブログでは、これまでの業務で培った経験を基に、日々の業務で遭遇した問題の解決方法や、システム構築の具体的な手順を解説。現場のエンジニアが実際に「困ったとき」に参照できる情報を意識して投稿していこうと思っています。

StarTellerをフォローする
StarTellerをフォローする

コメント

タイトルとURLをコピーしました