第9章 ファイル検索とアーカイブ
LPIC-1 103.3 相当
条件を指定してファイルを探し出す方法と、複数のファイルを1つにまとめて圧縮する方法を学びます。バックアップ作業などで頻繁に使う知識です。
find — 条件を指定してファイルを探す
$ find /var/log -name "*.log" # 名前で検索
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/syslog.log
$ find /home -type d # ディレクトリだけを検索
/home
/home/user
/home/user/docs
$ find /var/log -mtime -7 # 7日以内に更新されたファイル
/var/log/syslog
/var/log/auth.log
$ find / -size +100M # 100MBを超えるファイル
/var/lib/docker/overlay2/.../diff.tar
/var/log/journal/.../system.journal
$ find / -perm -4000 # SUIDが設定されたファイル(第16章で解説)
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/su
この行のこの値に注目: findの結果は該当したファイル・ディレクトリのフルパスがそのまま列挙される点が共通しています。-perm -4000の結果にあるpasswd・sudo・suは、一般ユーザーが一時的にroot権限で処理を行うためにSUIDが設定されている代表的なコマンドです。
find はディスク上を実際に走査するため、大きなディレクトリでは時間がかかります。
locate — 高速な名前検索
locate は事前に作成されたデータベース(updatedb で更新)を検索するため、find より高速です。ただしデータベース更新以降に作られたファイルは見つからないことがあります。
$ sudo updatedb # データベースを更新(正常終了時は無出力)
$ locate httpd.conf # 高速検索
/etc/httpd/conf/httpd.conf
/usr/share/doc/httpd/httpd.conf.default
この行のこの値に注目: locateはファイル名の一部が一致する候補もまとめて表示するため、この例では実際の設定ファイルとドキュメント同梱のサンプルファイルの両方がヒットしています。目的のファイルを絞り込むには、パスの一部(/etc/httpd/など)も含めて検索するのが実用的です。
tar — 複数ファイルをひとまとめにする
| オプション | 意味 |
|---|---|
-c | 新規作成(create) |
-x | 展開(extract) |
-t | 中身の一覧表示 |
-z | gzip圧縮を併用 |
-v | 処理中のファイル名を表示(verbose) |
-f | 対象のアーカイブファイル名を指定 |
$ tar -czvf backup.tar.gz /home/user/docs # 圧縮しながらアーカイブ作成
home/user/docs/
home/user/docs/memo.txt
home/user/docs/readme.txt
$ tar -tvf backup.tar.gz # 中身を確認
drwxr-xr-x user/user 0 2026-08-20 09:00 home/user/docs/
-rw-r--r-- user/user 120 2026-08-20 09:00 home/user/docs/memo.txt
-rw-r--r-- user/user 350 2026-08-20 09:00 home/user/docs/readme.txt
$ tar -xzvf backup.tar.gz # 展開
home/user/docs/
home/user/docs/memo.txt
home/user/docs/readme.txt
この行のこの値に注目: -vを付けているため、作成・展開のどちらも処理したファイル名がその場で流れます。-tによる一覧表示だけはls -lに似た形式で、権限・所有者・サイズ・日時も一緒に確認できる点が異なります。
gzip / zip
$ gzip file.txt # file.txt.gz を作成し元ファイルは削除(正常時は無出力)
$ gunzip file.txt.gz # 展開して元に戻す(正常時は無出力)
$ zip archive.zip a.txt b.txt
adding: a.txt (deflated 42%)
adding: b.txt (deflated 38%)
$ unzip archive.zip
Archive: archive.zip
inflating: a.txt
inflating: b.txt
この行のこの値に注目: gzip/gunzipが無出力なのに対し、zip/unzipは既定で処理したファイルごとに1行ずつ表示します。deflated 42%は圧縮によってファイルサイズが42%削減されたことを意味し、圧縮率の目安として確認できます。
findで見つけたファイルに対して操作する
findは単に検索するだけでなく、見つけたファイルに対してそのままコマンドを実行できます。
$ find /var/log -name "*.log" -exec rm {} \; # 見つけたファイルを1つずつ削除({}が該当ファイルに置換される。正常時は無出力)
$ find /var/log -name "*.log" -exec rm {} + # +でまとめて1回のコマンドに渡す(高速。正常時は無出力)
$ find /home -name "*.tmp" | xargs rm # xargsで標準入力から引数を組み立てて渡す(正常時は無出力)
-exec ... {} \; はファイル1件ごとにコマンドを起動するため、対象が多いと低速になります。まとめて渡せる場合は + や xargs の利用を検討しましょう。また、-exec rmやxargs rmのように検索結果をそのまま削除に使う場合、-nameの条件が広すぎると意図しないファイルまで消してしまう危険があります。実行前に-exec rmやxargs rmの部分を一時的に外し、まずは対象ファイルの一覧だけを表示して確認する習慣をつけましょう。
圧縮形式の違いとcpio
tarはあくまで複数ファイルを1つに束ねる(アーカイブ化)ためのツールで、圧縮自体は別のツールと組み合わせて行います。
| 圧縮形式 | tarのオプション | 特徴 |
|---|---|---|
| gzip | -z | 圧縮率・速度のバランスが良く、もっとも広く使われる |
| bzip2 | -j | gzipより圧縮率が高いが低速 |
| xz | -J | さらに高圧縮率だが低速。近年のパッケージ配布でよく使われる |
tarとは別に、cpioもアーカイブを作成する伝統的なツールです。findの出力を直接受け取れるのが特徴で、initramfsの作成などにも使われています。
$ find . -name "*.conf" | cpio -o > conf.cpio # -o: 標準入力のファイル一覧をアーカイブ化
12 blocks
$ cpio -id < conf.cpio # -i: 展開, -d: 必要なディレクトリを作成
12 blocks
この行のこの値に注目: cpioは処理が終わると、標準エラー出力に「◯ blocks」というブロック数(1ブロック=512バイト)を表示します。ファイル名の一覧は表示されないため、tarの-vのような詳細さはありませんが、処理が完了したことの簡易的な確認にはなります。
findのその他の便利な検索条件
更新日時やサイズ以外にも、findにはさまざまな検索条件(テスト)が用意されています。
| オプション | 意味 |
|---|---|
-mmin -30 | 30分以内に更新されたファイル |
-newer file | 指定したfileより新しく更新されたファイル |
-user 名前 | 指定したユーザーが所有するファイル |
-empty | 空のファイル・ディレクトリ |
-maxdepth N | 探索するディレクトリの深さをN階層までに制限 |
$ find /var/log -maxdepth 1 -name "*.log" -mmin -30 # 直下のみを対象に、30分以内に更新されたログを検索
/var/log/syslog.log
$ find /etc -newer /etc/hostname # /etc/hostnameより新しいファイルを検索
/etc/resolv.conf
/etc/hosts
この行のこの値に注目: -maxdepth 1を付けると、/var/log直下のファイルだけが対象になり、サブディレクトリ(/var/log/nginx/など)の中は探索されません。-newerの結果は「/etc/hostnameが最後に更新された時刻より後に変更されたファイル」という相対的な基準で絞り込まれています。
アーカイブの整合性を確認する
バックアップとして作成したアーカイブが、転送中の破損などなく正しい状態かを確認したい場合、ハッシュ値(チェックサム)を比較する方法がよく使われます。
$ sha256sum backup.tar.gz > backup.tar.gz.sha256 # ハッシュ値をファイルに保存しておく(画面には出さず、リダイレクト先のファイルに書き込む)
$ cat backup.tar.gz.sha256
3f2e1a4b5c6d47e89a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f backup.tar.gz
$ sha256sum -c backup.tar.gz.sha256 # 後日、保存したハッシュ値と一致するか検証
backup.tar.gz: OK
この行のこの値に注目: sha256sum -cの結果がOKであれば、現在のファイルの内容が保存しておいたハッシュ値と完全に一致しており、転送中や保存中の破損・改ざんがないことを確認できます。ここがFAILEDになった場合は、ファイルが何らかの理由で変化していることを意味します。
同様の用途で md5sum も使われますが、暗号学的な強度は sha256sum の方が高いため、セキュリティが重要な場面では sha256sum 以上が推奨されます。
大きなファイルを分割する — split
メール添付やUSBメモリの容量制限などで、大きなアーカイブファイルをそのまま扱えないことがあります。そのような場合はsplitで複数の小さなファイルに分割できます。
$ split -b 100M backup.tar.gz backup.part_ # 100MBごとに分割(正常時は無出力)
$ ls -lh backup.part_*
-rw-r--r-- 1 user user 100M Aug 20 09:00 backup.part_aa
-rw-r--r-- 1 user user 100M Aug 20 09:00 backup.part_ab
-rw-r--r-- 1 user user 42M Aug 20 09:00 backup.part_ac
$ cat backup.part_* > backup.tar.gz # 結合して元に戻す(画面には出力されずファイルへ書き込まれる)
この行のこの値に注目: 分割後にできるファイル名は指定した接頭辞(backup.part_)にaa・ab・ac...というアルファベットの連番が付きます。最後のファイル(この例ではbackup.part_ac)だけ端数のサイズになる点も確認しておくとよいでしょう。
rsyncとの使い分け
ファイルのバックアップやコピーという意味ではrsyncもよく使われますが、tarとは目的が少し異なります。
| ツール | 得意なこと |
|---|---|
| tar + gzip/xz | ある時点の状態を1つの圧縮ファイルにまとめて保管・転送する |
| rsync | 2つのディレクトリ間の差分だけを効率よく同期する(増分バックアップ、サーバー間の定期同期など) |
$ rsync -avz /home/user/docs/ backup:/backup/docs/ # -a: 属性を保持したまま再帰的にコピー, -v: 詳細表示, -z: 転送時に圧縮
sending incremental file list
memo.txt
readme.txt
sent 1,204 bytes received 58 bytes 2,524.00 bytes/sec
total size is 1,150 speedup is 0.91
この行のこの値に注目: 冒頭のsending incremental file listの後に列挙されるのは、実際に転送が必要だった(差分のあった)ファイルだけです。2回目以降の同期では、変更のないファイルはこの一覧に出てこなくなるため、転送量やこの一覧の行数を見れば、どれだけの差分が発生していたかを把握できます。
rsyncには--dry-run(-n)という便利なオプションもあります。実際にはファイルを転送・削除せず、「もし実行したら何が起きるか」だけを表示してくれるため、特に--deleteオプション(同期先にしかないファイルを削除して完全に一致させる)を使う前には、まず--dry-run付きで挙動を確認する習慣をつけておくと、意図しないファイル削除を未然に防げます。
アーカイブの中身だけを確認する
展開する前に、tarアーカイブの中に何が入っているかを確認したい場面はよくあります。-x(展開)の代わりに-tを使うと、実際にはファイルを展開せず、中身の一覧だけを表示できます。
$ tar -tzvf backup.tar.gz # 圧縮アーカイブの中身一覧を表示(展開はしない)
drwxr-xr-x user/user 0 2026-08-20 09:00 home/user/docs/
-rw-r--r-- user/user 120 2026-08-20 09:00 home/user/docs/memo.txt
-rw-r--r-- user/user 350 2026-08-20 09:00 home/user/docs/path/to/file.txt
$ tar -xzvf backup.tar.gz path/to/file.txt # アーカイブ内の特定の1ファイルだけを取り出す
path/to/file.txt
この行のこの値に注目: -tで確認した一覧に表示されているパス(この例ではpath/to/file.txt)をそのまま-xの引数に指定すると、アーカイブ全体を展開せずにその1ファイルだけを取り出せます。大きなアーカイブから一部のファイルだけ復元したい場合に役立つテクニックです。
大きなアーカイブをうっかりそのまま展開してディスクを圧迫してしまう前に、まず-tで中身を確認する習慣をつけておくと安全です。