sed-backup

2025/10/25
元記事

sed コマンドでのバックアップ指定方法

`sed -i.bak` でのバックアップファイル名

バックアップファイル名
sed -i.bak 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
このコマンドを実行すると、バックアップファイルは:
/etc/selinux/config.bak`
になります。

動作の詳細

`-i.bak` の仕組み:
  • `-i` の後に続く文字列(この場合`.bak`)が、元のファイル名の**末尾に追加**されます
  • 元ファイル:`/etc/selinux/config`
  • バックアップ:`/etc/selinux/config.bak`

様々なバックアップ指定例

# 1. 単純な拡張子追加
sed -i.bak 's/pattern/replace/' /etc/selinux/config
# → /etc/selinux/config.bak

# 2. 日付付きバックアップ
sed -i.$(date +%Y%m%d) 's/pattern/replace/' /etc/selinux/config
# → /etc/selinux/config.20251027

# 3. より詳細なタイムスタンプ
sed -i.bak-$(date +%Y%m%d_%H%M%S) 's/pattern/replace/' /etc/selinux/config
# → /etc/selinux/config.bak-20251027_143045

# 4. チルダ(~)を使う慣例
sed -i~ 's/pattern/replace/' /etc/selinux/config
# → /etc/selinux/config~

# 5. .origを使う(オリジナルの意味)
sed -i.orig 's/pattern/replace/' /etc/selinux/config
# → /etc/selinux/config.orig

実際の動作確認

# 実行前
$ ls -la /etc/selinux/
config

# コマンド実行
$ sudo sed -i.bak 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 実行後
$ ls -la /etc/selinux/
config # 変更されたファイル
config.bak # 元の内容を保持したバックアップ

# 内容の違いを確認
$ diff /etc/selinux/config.bak /etc/selinux/config
3c3
< SELINUX=enforcing
> SELINUX=disabled

注意点とTips

1. **既存バックアップの上書き**
# 注意:既に config.bak が存在する場合、上書きされます!
# より安全な方法(タイムスタンプ付き)
sed -i.bak-$(date +%Y%m%d_%H%M%S) 's/pattern/replace/' file
2. **バックアップを作りたくない場合**
# GNU sed(Linux)
sed -i '' 's/pattern/replace/' file    # エラーになる
sed -i 's/pattern/replace/' file       # バックアップなし
# BSD sed(macOS)
sed -i '' 's/pattern/replace/' file    # バックアップなし
3. **複数ファイルの処理**
# 複数ファイルを処理する場合
sed -i.bak 's/pattern/replace/' *.conf
# 結果
file1.conf → file1.conf.bak(バックアップ)
file2.conf → file2.conf.bak(バックアップ)

より実践的な使い方

# 1. バックアップディレクトリを分ける方法
cp /etc/selinux/config /tmp/config.bak-$(date +%Y%m%d)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 2. バックアップの世代管理
backup_with_rotation() {
local file=$1
local max_backups=5

# 古いバックアップを削除
ls -t $file.bak* 2>/dev/null | tail -n +$*1 | xargs rm -f

# 新しいバックアップを作成
sed -i.bak-$(date +%Y%m%d_%H%M%S) 's/^SELINUX=.*/SELINUX=disabled/' "$file"
}

# 3. 変更前後の確認を含む安全な方法
safe_sed_with_backup() {
local file="/etc/selinux/config"
local backup="$file.bak-$(date +%Y%m%d_%H%M%S)"

# 明示的にバックアップ作成
cp -a "$file" "$backup"
echo "バックアップ作成: $backup"

# sed実行(-iでバックアップなし、既に作成済みなので)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' "$file"

# 差分表示
diff -u "$backup" "$file"
}

まとめ
  • `sed -i.bak` は簡潔で便利。シンプルで覚えやすい。自動的にバックアップ作成
  • でも、既存の`.bak`ファイルを上書き。タイムスタンプがないので、いつのバックアップか不明

推奨される書き方:**

# タイムスタンプ付きが安全
sed -i.bak-$(date +%Y%m%d_%H%M%S) 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
これで、複数回実行してもバックアップが上書きされず、変更履歴を追跡できます。

*1 : max_backups+1