Linuxでファイルを削除する基本コマンド|安全にrmを使うためのポイント

Linux

Linuxサーバや開発環境で作業していると、不要になったファイルやディレクトリを削除したい場面は必ず出てきます。

しかし、Linuxの削除コマンドはとても強力で、一歩間違うと重要なファイルを二度と戻せなくなるリスクがあります。

この記事では:

  • Linuxでファイルやディレクトリを削除する基本コマンド
  • 安全性を重視したオプションの使い方
  • 誤削除を防ぐための具体的な対策
  • 削除したファイルの復元方法と予防策

をわかりやすく解説します。これを読めば、もう「削除してはいけないファイルを消してしまった…」と慌てることもなくなりますよ!

スポンサーリンク

Linuxのファイル削除コマンドの基本

rmコマンドの基本構文

Linuxでファイルを削除する最も基本的なコマンドはrm(remove)です:

rm [オプション] ファイル名

単一ファイルの削除

基本的な削除

rm test.txt

この場合、test.txtが即座に削除されます。WindowsやmacOSのゴミ箱のような機能はなく、完全に削除されることに注意が必要です。

複数ファイルの同時削除

rm file1.txt file2.txt file3.txt

または、ワイルドカードを使用:

rm *.txt        # 拡張子が.txtのファイルをすべて削除
rm test_*       # test_で始まるファイルをすべて削除

ディレクトリの削除

空のディレクトリの削除

rmdir ディレクトリ名

rmdirは空のディレクトリのみ削除可能です。中身がある場合はエラーになります。

中身があるディレクトリの削除

rm -r ディレクトリ名

-r(recursive)オプションで、ディレクトリとその中身を再帰的に削除します。

rmコマンドの重要なオプション

安全性重視のオプション

-i(interactive): 削除確認

rm -i ファイル名

動作例

$ rm -i important.txt
rm: remove regular file 'important.txt'? y

各ファイルの削除前に確認を求めるため、誤削除を防げます。

-I(大文字のI): まとめて確認

rm -I *.txt

3個以上のファイルを削除する場合、または再帰削除時に一度だけ確認。-iより効率的です。

-v(verbose): 削除過程を表示

rm -v *.log

出力例

removed 'error.log'
removed 'access.log'
removed 'debug.log'

何が削除されたかが分かるため、処理の確認に便利です。

効率性重視のオプション

-f(force): 強制削除

rm -f ファイル名

特徴

  • 存在しないファイルでもエラーを出さない
  • 確認なしで削除を実行
  • 読み取り専用ファイルも強制的に削除

注意点 非常に強力なオプションのため、使用時は十分な注意が必要です。

-rまたは-R(recursive): 再帰削除

rm -r ディレクトリ名

ディレクトリとその中身をすべて削除します。

よく使われるオプションの組み合わせ

-rf: 最も強力で危険な組み合わせ

rm -rf ディレクトリ名

用途

  • 不要なプロジェクトディレクトリの完全削除
  • ビルド成果物の一括削除
  • 一時ファイルのクリーンアップ

危険性 間違ったパスを指定すると、システム全体を破壊する可能性があります。

-riv: 安全な再帰削除

rm -riv ディレクトリ名

再帰削除しながら、各ファイルの確認と削除過程の表示を行います。

高度な削除テクニック

条件付きファイル削除

特定の拡張子のファイルのみ削除

find . -name "*.tmp" -type f -delete

特定の日数より古いファイルを削除

find /var/log -name "*.log" -mtime +30 -delete

30日より古いログファイルを削除します。

特定のサイズ以上のファイルを削除

find . -size +100M -type f -delete

100MB以上のファイルを削除します。

パターンマッチングを使った削除

複雑なパターンでの削除

rm -v *.{tmp,bak,log}     # 複数の拡張子を同時指定
rm -v test[0-9].txt       # test0.txt〜test9.txtを削除
rm -v !(important.txt)    # important.txt以外を削除(bashの拡張グロブ)

大量ファイルの削除

引数が多すぎる場合の対処

find . -name "*.tmp" -print0 | xargs -0 rm -v

ファイル数が非常に多い場合、rmの引数制限を回避できます。

削除事故を防ぐための対策

基本的な予防策

1. 削除前の確認習慣

現在地の確認

pwd  # 現在のディレクトリを確認

対象ファイルの確認

ls -la ファイルやディレクトリ名  # 削除対象の詳細確認

ディレクトリの中身確認

ls -la ディレクトリ名/  # 削除前に中身を確認
tree ディレクトリ名      # ツリー構造で表示

2. テスト実行のテクニック

削除をシミュレーション

find . -name "*.tmp" -type f  # -deleteを付けずに対象ファイルを確認

lsで事前確認

ls *.log  # ワイルドカードの展開結果を事前確認

システム設定による予防

エイリアスの設定

~/.bashrcまたは~/.bash_profileに追記

# 安全なrmコマンドのエイリアス
alias rm='rm -i'
alias rms='rm -v'     # 削除過程を表示
alias rmf='rm -f'     # 強制削除(注意深く使用)

# より安全な代替コマンド
alias del='mv --target-directory=/tmp'  # 削除の代わりに/tmpに移動

エイリアスの反映

source ~/.bashrc

関数による高度な予防

~/.bashrcに安全削除関数を定義

safe_rm() {
    echo "削除対象: $@"
    echo "本当に削除しますか? (yes/no)"
    read answer
    if [ "$answer" = "yes" ]; then
        rm "$@"
    else
        echo "削除をキャンセルしました"
    fi
}
alias srm='safe_rm'

バックアップとゴミ箱機能

trashコマンドの導入

Ubuntu/Debianでのインストール

sudo apt install trash-cli

使用方法

trash ファイル名           # ゴミ箱に移動
trash-list               # ゴミ箱の中身を表示
trash-restore            # ファイルを復元
trash-empty              # ゴミ箱を空にする

自作ゴミ箱スクリプト

シンプルなゴミ箱機能

#!/bin/bash
# ~/.local/bin/trash.sh
TRASH_DIR="$HOME/.trash"
mkdir -p "$TRASH_DIR"

for file in "$@"; do
    if [ -e "$file" ]; then
        mv "$file" "$TRASH_DIR/$(basename "$file").$(date +%Y%m%d_%H%M%S)"
        echo "Moved $file to trash"
    fi
done

削除したファイルの復元方法

即座の対処法

ファイルシステムレベルでの復元

extundeleteの使用(ext3/ext4)

sudo apt install extundelete
sudo extundelete /dev/sda1 --restore-all

photorec/testdiskの使用

sudo apt install testdisk
sudo photorec  # 対話式で復元作業

プロセスレベルでの復元

削除直後で、ファイルがまだプロセスで開かれている場合

lsof | grep deleted     # 削除されたが開かれているファイルを表示

システムレベルでの予防策

定期バックアップの設定

rsyncによる定期バックアップ

#!/bin/bash
# 毎日の自動バックアップスクリプト
rsync -av --delete /home/user/ /backup/user_backup/

cronでの自動実行

# crontab -e で編集
0 2 * * * /home/user/scripts/backup.sh

危険なコマンドパターンと対策

絶対に避けるべきコマンド

最も危険なパターン

rm -rf /          # システム全体を削除(現在は保護機能あり)
rm -rf /*         # ルートディレクトリの全内容を削除
rm -rf $VAR/      # 変数が空の場合、ルートから削除される危険

変数を使用する際の安全な書き方

危険な例

rm -rf $HOME/tmp  # $HOMEが設定されていない場合、/tmpが削除される

安全な例

if [ -n "$HOME" ] && [ -d "$HOME/tmp" ]; then
    rm -rf "$HOME/tmp"
else
    echo "Error: Invalid path"
    exit 1
fi

よくある誤操作パターン

スペースの誤入力

# 危険: スペースが入ると意図しない削除
rm -rf /var /log    # /varと/logを削除(/var/logではない)

# 安全: パスを確認
rm -rf /var/log     # 正しいパス指定

ワイルドカードの展開ミス

# 危険: 意図しない展開
rm * .txt           # すべてのファイルと.txtファイルを削除

# 安全: クォートで保護
rm "*.txt"          # *.txtという名前のファイルのみ削除

トラブルシューティング

削除できない場合の対処法

権限エラー

# エラー例
rm: cannot remove 'file.txt': Permission denied

# 対処法
sudo rm file.txt                    # 管理者権限で削除
chmod +w file.txt && rm file.txt   # 書き込み権限を追加してから削除

ファイルが使用中の場合

# 使用中のプロセスを確認
lsof ファイル名
fuser ファイル名

# プロセスを終了してから削除
sudo kill -9 プロセスID
rm ファイル名

特殊文字を含むファイル名

# ハイフンで始まるファイル名
rm ./-filename

# スペースを含むファイル名
rm "file name.txt"
rm file\ name.txt

# 制御文字を含む場合
ls -b                    # 制御文字を表示
rm $'file\tname.txt'     # タブ文字を含む場合

まとめ

Linuxでのファイル削除は強力な機能ですが、適切な知識と対策なしに使用すると重大な事故につながる可能性があります。重要なポイントを整理すると:

基本原則

  • 削除前の確認lspwdで対象と場所を必ず確認
  • 段階的実行:いきなり-rfを使わず、まず-iで確認
  • バックアップ:重要なデータは事前にバックアップ

安全なコマンド使用法

  • 単一ファイルrm -i ファイル名
  • ディレクトリrm -riv ディレクトリ名
  • 大量削除findコマンドとの組み合わせ

予防策の実装

  • エイリアス設定alias rm='rm -i'で誤操作防止
  • ゴミ箱機能trash-cliやカスタムスクリプトの活用
  • 定期バックアップrsyncやその他のバックアップツール

緊急時の対処

  • 即座の復元試行extundeletephotorec等のツール
  • プロセス確認lsofでまだ開かれているファイルをチェック
  • システム復旧:バックアップからの復元

実践的なワークフロー

  1. 現在地確認pwdで作業ディレクトリを確認
  2. 対象確認lsでファイル/ディレクトリの存在と内容を確認
  3. テスト実行:小さな範囲でテスト削除
  4. 本実行:確認が取れてから実際の削除実行
  5. 結果確認lsで削除結果を確認

コメント

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