Unix(Linux)にはdeleteコマンドはない
- rm
- rmdir
- unlink
(↓ファイル系じゃないけど)
- apt remove
- apt autoremove
- rmindex
「削除」なのになぜdeleteではなくremoveなのか?
結論から言えば,
deleteという単語は 「実体を消し去る(関係するものも消え,存在しなかった状態)」 にするという意味合いがあり,少し異なる.よりはremoveの 「ある場所や関係から取り除く」 のほうがイメージに近かったのだろう.
Unixではファイルを「削除」していない
ファイル実体とファイル名は1対1で対応していない
foo.txt
↓
inode値 ← bar.txt
↓
data
ここでfoo.txtとinode値は1対1で対応しておらず,例えばbar.txtというファイルもfoo.txtと同じinode値を持つこともできる(ハードリンク).
rm foo.txt を実行すると,unlink()というシステムコールが呼び出され,名前だけ消える.これだけではディスク内にあるファイルの実体は 削除されない .あくまでinodeへのリンクが切れるだけなのである.
inode値 ← bar.txt
↓
data
リンク数が0になり,かつプロセスから参照されていない時点で初めて,これらが解放されるのである.つまり,Unixにおける「削除」とは,ファイルを消し去ることではなく,名前とファイル実体との結び付きを切ることなのである.
Unixは一つのPCを複数人で利用することを想定しており,ある人がファイルが不要になっても別の人がファイルをまだ使っているということも十分に起こりうる.ファイル名と実体を分離して考えることで,ハードリンクや開いたまま削除が実現できる.
MS-DOS(Windows)では
一方で,windowsの前身であるMS-DOSでは ファイル名=ファイル実体 という考え方であった.なのでDELというコマンドが存在し, DEL foo.txt を実行すると,ファイル名とファイル実体どちらもディレクトリエントリから 削除される.
foo.txt
||
data
MS-DOSはシングルタスクかつシンプルなファイル設計なので,ファイルを削除されてもまだ実体は残っていて使える,という必要がなかったのである.
現在のWindows NT系になってからはNTFSが採用され,MFT (Master File Table)という考えが登場した.これはUnixのinodeと似たような考えである.
foo.txt
↓
MFT #123
↓
data
実際,Windowsにもハードリンクが存在するため,ファイル名とファイル実体は必ずしも1対1ではない.
内部構造的にはUnixに近いものとなったが,MS-DOS的な名前を維持した結果,現在でもファイル削除のコマンドは del のままなのである.
まとめ
それぞれファイルの削除についての考え方が違い,それに即したコマンド名をつけていることにより,Unix(linux)にはdeleteが存在せず,MS-DOS(Windows)にはdelコマンドが存在するということになったのだろう.