あるプロジェクトが終了して作業していたディレクトリを削除するとき、
- ファイル
- ディレクトリ
- シンボリックリンク
インターネット上には「rmコマンドはシンボリックリンク先まで削除する」だとか、「unlinkコマンドを使えば安全」だとか、「rmとunlinkは内部的に同じである」だとか、真偽の分からない情報が錯綜しているので改めて自分で動かして見て確認する。
削除想定するディレクトリ構造
bbbのディレクトリを例としてシンボリックリンクを含むディレクトリを削除することを考える
├── aaa
│ └── aaa.txt
└── bbb // 削除対象ディレクトリ
├── aaa -> ./aaa
├── bbb.txt
└── ccc
└── aaa -> ./aaa/aaa.txt
ディレクトリ構造の作成手順:
mkdir aaa
touch ./aaa/aaa.txt
mkdir bbb
touch ./bbb/bbb.txt
mkdir ./bbb/ccc
ln -s ./aaa ./bbb/aaa
ln -s ./aaa/aaa.txt ./bbb/ccc/aaa
動作確認環境:
・Ubuntu 22.04.4 LTS
・Ubuntu 22.04.4 LTS
安全な削除方法一覧
方法1. rmコマンドを用いる
基本的にrmコマンドで削除するで問題ないようです。シンボリックリンク先を削除するための余計なオプションを付けない限りシンボリックリンク先まで削除することはありません。コマンド:
rm ./bbb -rf
├── aaa
│ └── aaa.txt
参考:
本記事末尾にシンボリックリンクを直接指定して削除する場合の補足あり。
方法2. unlinkコマンドを用いる
unlikコマンドは、rmコマンドの「単一ファイルの削除機能」を切り出したもので、ファイル、シンボリックリンクの削除に使えます。(もちろんシンボリックリンク先を再帰的に削除しません)
「単一」ファイルの削除なので、再帰的に削除していかない点でシンボリックリンクの削除向けで安全という通説が広まっているのかもしれません。
つまり、ディレクトリは削除できないのでunlinkを用いる場合はfindコマンドなどを併用します。面倒なのでこちらを無理して使う理由はあまりないような気もします。
以下3ステップで順に削除していきます。
Step1.
コマンド:
# ファイルだけを削除
find ./bbb/ -type f -delete
Step2.
コマンド:
# シンボリックの削除(シンボリック先まで再帰的に削除しない)
find ./bbb/ -type l | xargs -i unlink {}
# シンボリックの削除(シンボリック先まで再帰的に削除しない)
find ./bbb/ -type l | xargs rm
Step3.
コマンド:
# 空になったディレクトリを削除
find /bbb/ -type d -empty -delete
実行後ディレクトリ:(bbb下だけ消える)
├── aaa
│ └── aaa.txt
補足: シンボリックリンクだけを指定して削除する動作確認
同じように「-rf」オプションでシンボリックリンクだけを指定して削除してみます。この場合でも、特にシンボリックリンク先が削除されることはありませんでした。
コマンド:
rm ./bbb/aaa -rf
├── aaa
│ └── aaa.txt
├── bbb
│ ├── bbb.txt
│ └── ccc
│ └── aaa -> ./aaa/aaa.txt
rm ./bbb/aaa/ -rf
├── aaa
│ └── aaa.txt
├── bbb
│ ├── aaa -> ./aaa
│ ├── bbb.txt
│ └── ccc
│ └── aaa -> ./aaa/aaa.txt
rm ./bbb/ccc/aaa -rf
├── aaa
│ └── aaa.txt
├── bbb
│ ├── aaa -> ./aaa
│ ├── bbb.txt
│ └── ccc
以上