Linuxでディレクトリを中身ごと削除する方法|rmの正しい使い方と注意点

Linux

Linuxで作業をしていると、不要になったディレクトリを 中身ごと一気に削除したい ことがありますよね。

でも 「rm -rってよく聞くけど、本当に全部消えるの?」
「誤って大事なデータまで消してしまわないか心配…」

そんな不安を持つ方も多いのではないでしょうか。

この記事では、Linuxでディレクトリを中身ごと削除するための基本コマンドから、安全に運用するコツまで、わかりやすく解説します。

スポンサーリンク

ディレクトリを中身ごと削除する基本

rmコマンドの基本的な使い方

Linuxでディレクトリを 中身ごと(ファイルやサブディレクトリを含めて)削除する場合、最も一般的なのが rm -r コマンドです。

基本の書式:

rm -r <ディレクトリ名>

-rオプションの意味:

  • recursive(再帰的)の略
  • ディレクトリの中にあるファイルやサブディレクトリをすべてたどって削除
  • 階層の深さに関係なく、すべての中身を削除

具体的な削除例

シンプルな削除:

rm -r /tmp/old_logs

これで /tmp/old_logs というディレクトリと、その中にある全ファイル・全サブディレクトリが一括で削除されます。

複数のディレクトリを同時削除:

rm -r /tmp/dir1 /tmp/dir2 /tmp/dir3

ワイルドカードを使った削除:

rm -r /tmp/backup_*

この場合、backup_ で始まるすべてのディレクトリが削除されます。

削除処理の流れ

rm -r を実行すると、以下の順序で削除が行われます:

  1. ディレクトリ内のファイルを削除
  2. サブディレクトリ内のファイルを削除
  3. 空になったサブディレクトリを削除
  4. 最後に指定したディレクトリ自体を削除

この処理は自動的に行われるため、手動で中身を消してからディレクトリを削除する必要はありません。

削除前の確認方法

ディレクトリの中身を確認

削除前に何が入っているかを確認するのは重要な習慣です。

基本的な中身確認:

ls -la /tmp/old_logs

ディレクトリ構造全体を確認:

tree /tmp/old_logs

ディスク使用量を確認:

du -sh /tmp/old_logs

ファイル数を確認:

find /tmp/old_logs -type f | wc -l

削除対象の絞り込み

特定の種類のファイルのみ確認:

find /tmp/old_logs -name "*.log" -type f

更新日が古いファイルを確認:

find /tmp/old_logs -mtime +30 -type f

大きなファイルを確認:

find /tmp/old_logs -size +100M -type f

これらのコマンドで、本当に削除して良いものかを事前に判断できます。

安全に削除するためのオプション

-iオプション:確認しながら削除

rmには -i という「インタラクティブ(interactive)」オプションがあります。

使い方:

rm -ri <ディレクトリ名>

実際の動作例:

$ rm -ri sampledir
rm: descend into directory 'sampledir'? y
rm: remove regular file 'sampledir/file1.txt'? y
rm: remove regular file 'sampledir/file2.txt'? n
rm: remove directory 'sampledir'? y

回答方法:

  • y または yes:削除を実行
  • n または no:削除をスキップ
  • q:削除処理を中断

-vオプション:削除過程を表示

何が削除されているかを確認したい場合は -v(verbose)オプションを使います。

使い方:

rm -rv <ディレクトリ名>

表示例:

$ rm -rv sampledir
removed 'sampledir/file1.txt'
removed 'sampledir/subdir/file2.txt'
removed directory 'sampledir/subdir'
removed directory 'sampledir'

-fオプション:強制削除(要注意)

よく見かける rm -rf についても説明しておきます。

使い方:

rm -rf <ディレクトリ名>

各オプションの意味:

  • -r:ディレクトリ内を再帰的に削除
  • -f:force(強制)- 存在しないファイルでもエラーを出さず、確認もしない

注意点:

  • 確認なしで即座に削除される
  • 読み取り専用ファイルも強制削除
  • 間違うと一瞬でデータが消える
  • 初心者には特に危険

誤削除を防ぐための運用テクニック

エイリアス設定で常に安全モード

多くのLinuxディストリビューションでは、最初から安全な設定がされている場合があります。

現在の設定を確認:

alias rm

よくある設定例:

alias rm='rm -i'

エイリアスが未設定の場合:

echo "alias rm='rm -i'" >> ~/.bashrc
source ~/.bashrc

その他の推奨エイリアス:

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

これらを設定しておくと、上書きや削除の際に常に確認されるようになります。

ドライランでの確認

実際に削除する前に、何が削除されるかを確認する方法があります。

findコマンドでのシミュレーション:

find /tmp/old_logs -type f -print
find /tmp/old_logs -type d -print

削除予定のファイル一覧をファイルに保存:

find /tmp/old_logs -type f > deletion_list.txt
cat deletion_list.txt  # 内容を確認

バックアップを取ってから削除

大事なディレクトリを削除する前には、必ずバックアップを取りましょう。

cpコマンドでのバックアップ:

cp -a /path/to/important_dir /backup/location/

rsyncでのバックアップ:

rsync -av /path/to/important_dir/ /backup/location/important_dir_backup/

tarでのアーカイブ作成:

tar -czf important_dir_backup_$(date +%Y%m%d).tar.gz /path/to/important_dir

特殊なケースでの削除方法

権限のないファイルが含まれる場合

sudoを使用:

sudo rm -r /protected/directory

権限を変更してから削除:

chmod -R 755 /stubborn/directory
rm -r /stubborn/directory

特殊文字を含むディレクトリ名

スペースを含む場合:

rm -r "My Documents"
# または
rm -r My\ Documents

特殊文字を含む場合:

rm -r 'directory$with&special*chars'

日本語ディレクトリ名:

rm -r "プロジェクト資料"

大量のファイルがある場合

通常のrmでは処理しきれない場合:

find /huge/directory -type f -delete
find /huge/directory -type d -empty -delete

xargsを使った分割処理:

find /huge/directory -name "*.tmp" | xargs -n 100 rm

より高度な削除テクニック

条件付き削除

古いファイルのみ削除:

find /tmp/logs -type f -mtime +7 -exec rm {} \;

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

find /tmp -type f -size +100M -exec rm {} \;

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

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

複数条件での削除

古くて大きなファイルを削除:

find /var/log -type f -mtime +30 -size +10M -exec rm {} \;

空のディレクトリのみ削除:

find /cleanup/target -type d -empty -delete

削除時のトラブルシューティング

よくあるエラーと対処法

「Permission denied」エラー:

# 解決法1: sudoを使用
sudo rm -r target_directory

# 解決法2: 所有権を変更
sudo chown -R $(whoami) target_directory
rm -r target_directory

「Directory not empty」エラー:

# 強制的に削除
rm -rf stubborn_directory

# または段階的に削除
find stubborn_directory -type f -delete
find stubborn_directory -type d -empty -delete

「Device or resource busy」エラー:

# ファイルを使用中のプロセスを確認
lsof +D /path/to/directory

# 該当プロセスを停止してから削除
sudo pkill process_name
rm -r /path/to/directory

削除が進まない場合の対処

処理状況の確認:

# 別のターミナルで進行状況を確認
watch -n 1 'ls -la /path/to/parent/directory'

プロセスの確認:

ps aux | grep rm

強制終了が必要な場合:

killall rm
# または
pkill -f "rm -r"

削除後の確認と検証

削除が完了したかの確認

ディレクトリの存在確認:

ls -la /path/to/parent/directory

ディスク使用量の変化確認:

df -h /path/to/filesystem

削除ログの確認:

# -vオプションを使った場合の出力を確認
rm -rv directory 2>&1 | tee deletion.log

削除後のクリーンアップ

一時ファイルの削除:

rm -f deletion_list.txt deletion.log

システムログの確認:

tail -f /var/log/syslog

安全な運用のベストプラクティス

推奨される作業手順

  1. 削除前の確認 ls -la target_directory du -sh target_directory find target_directory -type f | wc -l
  2. バックアップの作成 cp -a target_directory target_directory.backup
  3. 段階的な削除 rm -ri target_directory
  4. 削除後の確認 ls -la $(dirname target_directory)

自動化スクリプトの例

安全な削除スクリプト:

#!/bin/bash
# safe_remove.sh

if [ $# -eq 0 ]; then
    echo "使用法: $0 <削除対象ディレクトリ>"
    exit 1
fi

TARGET="$1"

# 存在確認
if [ ! -d "$TARGET" ]; then
    echo "エラー: $TARGET は存在しません"
    exit 1
fi

# 情報表示
echo "削除対象: $TARGET"
echo "サイズ: $(du -sh "$TARGET" | cut -f1)"
echo "ファイル数: $(find "$TARGET" -type f | wc -l)"

# 確認
read -p "本当に削除しますか? (yes/no): " answer
if [ "$answer" = "yes" ]; then
    rm -rf "$TARGET"
    echo "削除完了: $TARGET"
else
    echo "削除をキャンセルしました"
fi

まとめ

重要なポイント

基本的な削除方法:

  • ディレクトリを中身ごと削除rm -r <directory>
  • 確認しながら削除rm -ri <directory>
  • 削除過程を表示rm -rv <directory>
  • 強制削除(要注意)rm -rf <directory>

安全対策:

  • .bashrc にエイリアス設定:alias rm='rm -i'
  • 削除前の中身確認:ls -ladu -shtree
  • 必ずバックアップを取ってから削除
  • 段階的な削除で慎重に進める

避けるべきこと:

  • 確認なしでの rm -rf の実行
  • バックアップなしでの重要データ削除
  • ワイルドカードを使った一括削除での確認不足

特殊ケースへの対応:

  • 権限のないファイル:sudo または chmod
  • 特殊文字を含む名前:クォートやエスケープ
  • 大量ファイル:findxargs の組み合わせ

コメント

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