Linuxでディレクトリをアーカイブする方法では、sourceを–directoryで基準化し、存在しない.tarへ作成してlistとcompareで内容を検証する。tarは複数項目を一つのarchiveへ格納し、圧縮は別機能・オプションである。稼働中に変更されるsourceは一貫したsnapshotにならない。この記事はsource directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定するを判断軸にして、記事固有のコード、合否、停止条件、復元を順序立てて説明します。
圧縮率ではなく、directory treeを再現可能なarchiveへまとめる手順である。完了は「archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する」です。結果が空なら「sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する」として調べ、エラーを0件へ置き換えません。
archiveとcompressionを分ける
archiveとcompressionを分けるでは「source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する」という粒度で対象を特定します。tarは複数項目を一つのarchiveへ格納し、圧縮は別機能・オプションである。稼働中に変更されるsourceは一貫したsnapshotにならない。表示名や先頭候補だけを採用しません。
tarによるディレクトリアーカイブの対象が複数なら、候補数と除外理由を残します。tarによるディレクトリアーカイブでは実行ユーザー、OS・製品版、locale、カレントディレクトリも結果の解釈へ影響するため同時に記録します。
sourceと出力の衝突を確認
sourceを–directoryで基準化し、存在しない.tarへ作成してlistとcompareで内容を検証する。tarによるディレクトリアーカイブでは、単にコマンドが終了したことではなく「archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する」を完了条件にします。圧縮率ではなく、directory treeを再現可能なarchiveへまとめる手順である。
sourceと出力の衝突を確認に入る前に、対象、実行場所、権限、入力の由来を確認します。sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する。判定不能を成功へ丸めません。
親パスを含めない格納設計
親パスを含めない格納設計は変更や出力生成より先に行う観測です。source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定するを含む形で現状を保存し、後段のコードが同じ対象へ向くか確認します。
set -euo pipefail
source='./project'
archive='./project-20260717.tar'
test -d "$source" || { printf 'source_missing=%s\n' "$source" >&2; exit 1; }
source_abs=$(realpath -- "$source")
archive_abs=$(realpath --canonicalize-missing -- "$archive")
case "$archive_abs/" in "$source_abs"/*) printf 'archive_must_be_outside_source=%s\n' "$archive_abs" >&2; exit 1;; esac
test ! -e "$archive" || { printf 'archive_exists_no_change=%s\n' "$archive" >&2; exit 1; }
archive_dir=$(dirname -- "$archive")
test -d "$archive_dir" && test -w "$archive_dir" || { printf 'archive_directory_not_writable=%s\n' "$archive_dir" >&2; exit 1; }
printf 'source=%s\narchive=%s\narchive_free=true\n' "$source_abs" "$archive_abs"
tarは複数項目を一つのarchiveへ格納し、圧縮は別機能・オプションである。稼働中に変更されるsourceは一貫したsnapshotにならない。tarによるディレクトリアーカイブでは取得不能、対象なし、値が空という三状態を分け、stderrや終了コードを捨てません。
tarを新規ファイルとして作成
tarを新規ファイルとして作成では入力と出力を別々に再取得します。tarによるディレクトリアーカイブの合格は、archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致することです。件数だけでなく識別値と内容も照合します。
set -euo pipefail
source='./project'
archive='./project-20260717.tar'
test -d "$source" || exit 1
test ! -e "$archive" || { printf 'archive_exists_no_change=%s\n' "$archive" >&2; exit 1; }
archive_dir=$(dirname -- "$archive")
archive_leaf=$(basename -- "$archive")
tmp=$(mktemp --tmpdir="$archive_dir" ".$archive_leaf.tmp.XXXXXX")
cleanup() { rm -f -- "$tmp"; }
trap cleanup EXIT HUP INT TERM
tar --create --file="$tmp" --directory="$source" -- .
tar --list --file="$tmp" >/dev/null
if ! ln -- "$tmp" "$archive"; then
printf 'archive_commit_collision_no_change=%s\n' "$archive" >&2
exit 1
fi
rm -f -- "$tmp"
trap - EXIT HUP INT TERM
printf 'archive_committed_no_clobber=%s\n' "$archive"
sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する。tarによるディレクトリアーカイブの結果が期待と違えば追加変更を重ねず、入力、対象範囲、locale・時刻、権限、製品仕様の順に戻って調べます。
listで格納名とmodeを確認
listで格納名とmodeを確認ではsourceを–directoryで基準化し、存在しない.tarへ作成してlistとcompareで内容を検証する。tarによるディレクトリアーカイブのサンプルにあるパス、セル、ユーザー、時刻は検証用なので、直前に確認した承認値へ置き換えます。
set -euo pipefail
source='./project'
archive='./project-20260717.tar'
test -f "$archive" || { printf 'archive_missing=%s\n' "$archive" >&2; exit 1; }
tar --list --verbose --file="$archive" | sed -n '1,60p'
tar --compare --file="$archive" --directory="$source" -- .
restore_parent=${TMPDIR:-/tmp}
test -d "$restore_parent" && test ! -L "$restore_parent"
run_id=$(date -u +%Y%m%dT%H%M%SZ)-$$-$RANDOM
restore_dir=$(mktemp -d --tmpdir="$restore_parent" "ittrip-restore.$run_id.XXXXXXXX")
( umask 077; set -o noclobber; printf '%s\n' "$run_id" > "$restore_dir/.ittrip-owner" )
tar --extract --file="$archive" --directory="$restore_dir" --no-overwrite-dir
tar --compare --file="$archive" --directory="$restore_dir" -- .
restore_real=$(realpath -e -- "$restore_dir")
parent_real=$(realpath -e -- "$restore_parent")
case "$restore_real" in
("$parent_real"/ittrip-restore."$run_id".*) ;;
(*) printf 'STOP: restore ownership/path mismatch=%s\n' "$restore_real" >&2; exit 2 ;;
esac
test "$(cat -- "$restore_dir/.ittrip-owner")" = "$run_id"
printf 'archive_sha256=%s\n' "$(sha256sum -- "$archive" | awk '{print $1}')"
printf 'source_compare=pass\nrestore_compare=pass\n'
printf 'restore_retained_for_manual_review=%s\n' "$restore_real"
archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない。復元先はrun ID付きの別名directoryへno-clobberで作成し、owner tokenと実体pathを読み取り確認したうえで自動削除せず保持します。内容確認後の整理は、この掲載コードとは別の明示承認と作業記録に分けてください。
compareでsourceとの差を検査
原本は変更しない。archiveの復元は空の検証先へ行い、既存パスへ直接展開しない。復元にも「source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する」を用い、類似名の別対象へ処理しません。
- tarによるディレクトリアーカイブの開始前状態
- 採用対象: source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する
- 復元後の確認: archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する
- 復元を止める条件: archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない
snapshotではない一貫性の限界
archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない。snapshotではない一貫性の限界に当てはまるときは中止理由、対象識別子、終了コードまたはErr.Number、直前に成功した段階を保存します。
sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する。tarによるディレクトリアーカイブの再試行は原因を直し、同じ入力と対象を再確認してから行います。警告抑止や強制上書きで通しません。
復元試験を別directoryで行う
データベース等はアプリ固有backupかsnapshotを使い、tarだけで整合性を保証しない。tarによるディレクトリアーカイブを反復するときは、正常、差分なし、対象なし、要承認、失敗を別の状態として記録します。
| 復元試験を別directoryで行うの主キー | source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する |
| 採用条件 | archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する |
| 空結果 | sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する |
| 中止条件 | archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない |
archiveとcompressionを分けるから証跡化する親パスを含めない格納設計
tarによるディレクトリアーカイブの証跡は「source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する」を主キーにします。archiveとcompressionを分けるで確認した値と、実行直前・実行直後の値を同じ作業番号に保存し、表示名が似ている別対象や前回の結果を混ぜません。
sourceと出力の衝突を確認で空結果を判定するtarを新規ファイルとして作成
tarによるディレクトリアーカイブの空結果は「sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する」として扱います。sourceと出力の衝突を確認で入力自体が存在するか、権限で見えていないか、条件に一致しないだけかを分け、0件という表示だけで成功・失敗を決めません。
復元試験を別directoryで行うから復旧可否を測るarchiveとcompressionを分ける
tarによるディレクトリアーカイブの復旧判断では「原本は変更しない。archiveの復元は空の検証先へ行い、既存パスへ直接展開しない」を採用します。復元試験を別directoryで行うを再確認し、復旧後に「archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する」へ戻ったかを別の読み取り処理で測定します。
tarによるディレクトリアーカイブの事前確認では、source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定するを画面表示や標準出力だけで済ませず、実行日時と一緒に作業記録へ写します。tarは複数項目を一つのarchiveへ格納し、圧縮は別機能・オプションである。稼働中に変更されるsourceは一貫したsnapshotにならないという仕様があるため、似た名前の別対象、前回実行時の値、キャッシュされた表示を今回の対象と取り違えないことが重要です。
tarによるディレクトリアーカイブのコードを実行した直後は、まず終了状態を保存し、その後に別の読み取り処理で「archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する」を確認します。tarによるディレクトリアーカイブでは同じコードの表示だけを合否判定に使うと部分成功や遅延反映を見逃すため、識別値、件数、内容の三点を照合します。
tarによるディレクトリアーカイブで結果が得られない場合は、sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する。tarによるディレクトリアーカイブではこの状態と、権限拒否、入力形式の不一致、接続先や時刻の違いを一緒にしません。tarによるディレクトリアーカイブの対象候補数、除外された候補、最後に成功した確認処理を残すと、再試行で同じ失敗を重ねずに済みます。
tarによるディレクトリアーカイブを元へ戻す必要があるときは、原本は変更しない。archiveの復元は空の検証先へ行い、既存パスへ直接展開しない。tarによるディレクトリアーカイブの復元前にも変更後の識別値を再取得し、別担当者の更新が入っていないか確認します。tarによるディレクトリアーカイブの復元結果も通常処理と同じ完了条件で測り、戻したつもりという報告だけで閉じません。
tarによるディレクトリアーカイブを引き継ぐ記録には、データベース等はアプリ固有backupかsnapshotを使い、tarだけで整合性を保証しない。特に「archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない」に該当した場合は、実行を止めたこと自体を正しい結果として扱います。tarによるディレクトリアーカイブの次回担当者が承認範囲と未処理対象を区別できるよう、作業番号と対象識別子を対応付けます。
tarによるディレクトリアーカイブの作業記録には、開始前の対象候補、採用した識別値、実行したコード、終了後の実測、除外理由を同じ作業番号で保存します。「source directory、archive path、作成時刻、格納トップ、ファイル件数、SHA256を固定する」を省くと別対象との比較になり得るため、日時、実行場所、製品版と一緒に残します。
Linuxでディレクトリをアーカイブする方法を定期運用へ組み込む場合も初回は対話的に確認します。正常は「archiveが読め、格納名が意図した相対パスで、tar –compareが作成時点のsourceと一致する」、空結果は「sourceが空なら空directory entryの扱いを確認し、入力誤りと区別する」、停止は「archiveをsource配下へ作って自己取り込みしない。絶対パスや秘密鍵を意図せず格納しない」として報告し、次の担当者が同じ条件で追試できるようにします。
archiveを作成してからlistとcompareを行う
sourceとarchive pathの衝突がないことを確認し、tar –createを一度だけ実行します。終了コードが0でarchiveがregular fileとして存在するときだけtar –listで格納名を確認し、続けてtar –compareでsourceとの差を調べます。存在しないarchiveを先にlistする順序は使いません。
作成中にsourceが変化した場合は一貫したsnapshotとみなしません。復元試験は空の別directoryで行い、元のsourceへ直接展開しません。
公式情報・参考資料
tarによるディレクトリアーカイブのコマンド、API、対応範囲は次の公式一次資料で確認しました。確認日は2026年7月17日です。tarによるディレクトリアーカイブの実行環境にあるman、–help、VBA Object Browser、Get-Helpも併用してください。

コメント