【初心者向け】Linuxで複数のディレクトリをまとめて削除する方法|rmコマンドの使い方と注意点

Linux

「いくつもある不要なディレクトリを、一つ一つ削除するのは面倒…」
Linuxを使っていると、テストで作ったディレクトリや古いデータをまとめて削除したくなることがありますよね。

そんなときに便利なのが、rmコマンドを使った複数ディレクトリの一括削除です。

ただし使い方を間違えると、必要なデータまで一気に消してしまう危険もあります。

この記事では:

  • Linuxでディレクトリを削除する基本的なコマンド
  • 複数のディレクトリを効率的に一括削除する方法
  • 安全に削除するための事前確認とオプション
  • 削除失敗やデータ復旧に関する対策

を解説します。これを読めば、安全で効率的なディレクトリ管理ができるようになります。

スポンサーリンク

ディレクトリ削除の基本概念

Linuxにおけるディレクトリとファイルの違い

ディレクトリ(Directory)

  • ファイルを格納する「入れ物」
  • Windowsでいうフォルダと同じ概念
  • 階層構造を持ち、中に子ディレクトリやファイルを含む

削除の特殊性

  • 空のディレクトリ:rmdirコマンドで削除可能
  • 中身があるディレクトリ:rm -r(再帰削除)が必要
  • Linuxには「ゴミ箱」概念がないため、削除は即座に実行される

rmコマンドの基本構文

rm [オプション] ディレクトリ名・ファイル名

主要オプション

  • -r(recursive):ディレクトリを再帰的に削除
  • -f(force):確認なしで強制削除
  • -i(interactive):削除前に確認を求める
  • -v(verbose):削除過程を表示

基本的なディレクトリ削除方法

空のディレクトリの削除

rmdirコマンドの使用

rmdir empty_directory

特徴

  • 空のディレクトリのみ削除可能
  • 中身がある場合はエラーで停止
  • 安全性が高い

複数の空ディレクトリを削除

rmdir dir1 dir2 dir3

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

rm -rの基本使用

rm -r directory_name

動作説明

  1. ディレクトリ内のファイルを削除
  2. サブディレクトリがあれば再帰的に処理
  3. 最後にディレクトリ自体を削除

削除過程の確認

rm -rv directory_name

出力例

removed 'test_dir/file1.txt'
removed 'test_dir/subdir/file2.txt'
removed directory 'test_dir/subdir'
removed directory 'test_dir'

複数ディレクトリの一括削除方法

方法1:複数の名前を直接指定

基本的な指定方法

rm -r dir1 dir2 dir3

より多くのディレクトリを指定

rm -r project1 project2 project3 backup old_data temp_files

スペースを含む名前の処理

rm -r "Project Files" "Old Data" "Temp Directory"

または

rm -r Project\ Files Old\ Data Temp\ Directory

方法2:ワイルドカードパターンの活用

基本的なワイルドカード

アスタリスク(*)の使用

# testで始まるすべてのディレクトリ
rm -r test*

# 特定の拡張子で終わるディレクトリ
rm -r *_backup

# 特定の文字を含むディレクトリ
rm -r *temp*

クエスチョンマーク(?)の使用

# 1文字の違いがあるディレクトリ
rm -r dir? # dir1, dir2, dira, dirb など

# より複雑なパターン
rm -r test_??  # test_01, test_02 など

高度なパターンマッチング

角括弧([])での文字範囲指定

# 数字で終わるディレクトリ
rm -r dir[0-9]

# 特定の文字で終わるディレクトリ
rm -r project[abc]

# 数字の範囲指定
rm -r test[1-5]

波括弧({})での複数パターン

# 複数の拡張子パターン
rm -r *.{tmp,bak,old}

# 複数の接頭辞
rm -r {test,demo,temp}_*

方法3:findコマンドとの組み合わせ

条件に基づく削除

名前パターンでの検索と削除

find . -type d -name "test*" -exec rm -r {} +

更新日時での条件指定

# 30日より古いディレクトリを削除
find . -type d -mtime +30 -exec rm -r {} +

サイズでの条件指定

# 空のディレクトリのみ削除
find . -type d -empty -delete

より安全なfindの使用法

削除前に対象を確認

# まず対象を表示
find . -type d -name "temp*"

# 確認後に削除実行
find . -type d -name "temp*" -exec rm -r {} +

安全な削除のための事前確認

削除対象の事前確認方法

lsコマンドでの確認

基本的な確認

# ワイルドカードの展開結果を確認
ls -d test*

詳細情報付きの確認

# ディレクトリの詳細情報を表示
ls -ld test*

出力例

drwxr-xr-x 2 user user 4096 Jul  2 10:30 test1
drwxr-xr-x 3 user user 4096 Jul  2 10:31 test2
drwxr-xr-x 2 user user 4096 Jul  2 10:32 test_backup

treeコマンドでの構造確認

ディレクトリ構造の表示

tree test*

出力例

test1
├── file1.txt
└── file2.txt
test2
├── subdir
│   └── data.txt
└── config.txt
test_backup
└── backup.tar.gz

duコマンドでのサイズ確認

ディレクトリサイズの確認

du -sh test*

出力例

1.2M    test1
856K    test2
3.4M    test_backup

対話的削除オプション

-iオプションの活用

基本的な使用

rm -ri test*

動作例

rm: remove directory 'test1'? y
rm: remove directory 'test2'? y
rm: remove directory 'test_backup'? n

カスタム確認スクリプト

より詳細な確認を行うスクリプト

#!/bin/bash
for dir in test*; do
    if [ -d "$dir" ]; then
        echo "Directory: $dir"
        echo "Size: $(du -sh "$dir" | cut -f1)"
        echo "Files: $(find "$dir" -type f | wc -l)"
        read -p "Delete this directory? (y/n): " answer
        if [ "$answer" = "y" ]; then
            rm -r "$dir"
            echo "Deleted: $dir"
        else
            echo "Skipped: $dir"
        fi
        echo "---"
    fi
done

エラー処理と安全対策

削除時によくあるエラー

権限エラーの対処

エラー例

rm: cannot remove 'protected_dir': Permission denied

対処法

# 権限を確認
ls -ld protected_dir

# 権限を変更してから削除
chmod -R 755 protected_dir
rm -r protected_dir

# 管理者権限で削除
sudo rm -r protected_dir

ファイルが使用中の場合

エラー例

rm: cannot remove 'busy_dir/file.txt': Device or resource busy

対処法

# ファイルを使用しているプロセスを確認
lsof +D busy_dir

# プロセスを終了してから削除
kill -9 <プロセスID>
rm -r busy_dir

バックアップとリスク管理

削除前のバックアップ作成

重要なディレクトリのバックアップ

# tar.gzでのバックアップ
tar -czf backup_$(date +%Y%m%d_%H%M%S).tar.gz important_dir

# 別の場所へのコピー
cp -r important_dir /backup/location/

# rsyncでのバックアップ
rsync -av important_dir/ /backup/location/important_dir/

段階的削除の実践

テスト環境での事前確認

# 1. まず1つのディレクトリで試す
rm -r test1

# 2. 問題がなければ複数実行
rm -r test2 test3

# 3. 最後にワイルドカードを使用
rm -r test*

高度な削除テクニック

条件付き削除の実装

日付条件での削除

特定期間より古いディレクトリを削除

# 7日より古いディレクトリ
find . -maxdepth 1 -type d -mtime +7 -not -name "." -exec rm -r {} +

# 特定日付より前のディレクトリ
find . -maxdepth 1 -type d -not -newermt "2024-01-01" -not -name "." -exec rm -r {} +

サイズ条件での削除

特定サイズ以上のディレクトリを削除

# 1GB以上のディレクトリを見つけて削除
find . -maxdepth 1 -type d -exec du -s {} + | awk '$1 > 1048576 {print $2}' | xargs rm -r

内容に基づく削除

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

find . -type d -empty -delete

特定のファイルを含まないディレクトリを削除

find . -maxdepth 1 -type d ! -name "." ! -exec test -e {}/important.txt \; -print0 | xargs -0 rm -r

並列処理による高速化

xargsでの並列削除

基本的な並列処理

echo "dir1 dir2 dir3 dir4" | xargs -n 1 -P 4 rm -r

findと組み合わせた並列処理

find . -maxdepth 1 -type d -name "temp*" -print0 | xargs -0 -n 1 -P 4 rm -r

GNU parallelでの高速処理

parallelのインストールと使用

# インストール(Ubuntu/Debian)
sudo apt install parallel

# 使用例
ls -d temp* | parallel rm -r {}

削除の代替手段

ゴミ箱機能の実装

trash-cliの使用

インストール

# Ubuntu/Debian
sudo apt install trash-cli

# CentOS/RHEL
sudo yum install trash-cli

使用方法

# ディレクトリをゴミ箱に移動
trash dir1 dir2 dir3

# ゴミ箱の内容を確認
trash-list

# ゴミ箱から復元
trash-restore

# ゴミ箱を空にする
trash-empty

カスタムゴミ箱スクリプト

シンプルなゴミ箱機能

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

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

# 使用例
safe_remove dir1 dir2 dir3

移動による「削除」

一時的な隔離

隔離ディレクトリの作成と使用

# 隔離用ディレクトリの作成
mkdir -p /tmp/quarantine

# ディレクトリを隔離
mv unwanted_dir1 unwanted_dir2 /tmp/quarantine/

# 後で確認して完全削除
ls /tmp/quarantine/
rm -r /tmp/quarantine/*

トラブルシューティング

よくある問題と解決法

問題1:削除が途中で止まる

原因

  • 権限不足
  • ファイルシステムエラー
  • ディスク容量不足

対処法

# 権限の確認と修正
sudo chmod -R 755 problem_dir
sudo chown -R $USER:$USER problem_dir

# ファイルシステムのチェック
sudo fsck /dev/sdXY

# ディスク容量の確認
df -h

問題2:削除後にディスク容量が減らない

原因

  • プロセスがファイルを開いたまま
  • シンボリックリンクの問題

対処法

# 削除されたが開かれているファイルの確認
lsof | grep deleted

# プロセスの再起動
sudo systemctl restart サービス名

# システムの再起動(最終手段)
sudo reboot

問題3:必要なファイルまで削除してしまった

予防策

# 削除前のバックアップ
cp -r important_data backup_location

# ドライラン(実際には削除しない)
echo rm -r target* # コマンドを表示するだけ

復旧方法

# ファイルシステムレベルでの復旧ツール
sudo apt install testdisk photorec
sudo photorec

# バックアップからの復元
rsync -av backup_location/ original_location/

ベストプラクティスとまとめ

安全な削除のためのチェックリスト

削除前の確認事項

  1. 対象の確認ls -dで削除対象を表示
  2. 内容の確認treeduで構造とサイズを確認
  3. バックアップ:重要なデータは事前にバックアップ
  4. 権限の確認:適切な権限で実行しているか確認
  5. テスト実行:可能であれば小さな範囲でテスト

推奨される削除手順

  1. 段階的実行:一度に全部ではなく、段階的に削除
  2. 対話的削除-iオプションで確認しながら実行
  3. ログ記録:削除内容をログに記録
  4. 定期的な整理:不要ディレクトリが溜まる前に定期的に整理

コマンド使い分けガイド

用途別推奨コマンド

安全性重視

rm -ri dir1 dir2 dir3    # 対話的削除
trash dir1 dir2 dir3     # ゴミ箱を使用

効率性重視

rm -r dir1 dir2 dir3     # 直接削除
rm -r dir*               # ワイルドカード使用

条件付き削除

find . -type d -name "temp*" -exec rm -r {} +    # 条件に基づく削除

まとめ

Linuxで複数のディレクトリを削除する方法は多岐にわたりますが、安全性を最優先に考えることが重要です。

重要なポイント

  • 事前確認:削除前に必ず対象を確認
  • 段階的実行:一度に大量削除せず、段階的に実施
  • バックアップ:重要なデータは事前にバックアップ
  • 適切なツール選択:用途に応じてコマンドやオプションを選択

基本的な削除方法

  • rm -r dir1 dir2 dir3:複数ディレクトリの直接指定
  • rm -r pattern*:ワイルドカードパターンの活用
  • rm -ri:対話的な安全削除

高度な削除方法

  • findコマンドとの組み合わせ
  • 条件に基づく削除
  • 並列処理による高速化

コメント

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