web-dev-qa-db-ja.com

rm -rf *は、現在のディレクトリまたは親/ルートディレクトリからファイルを再帰的に削除しますか?

特定のフォルダーからファイルとフォルダーを再帰的に削除したいので、このフォルダーからこのコマンドを実行しました

rm -rf *

現在のディレクトリの下にあるすべてのファイル/ディレクトリを再帰的に削除すると想定しました。その後、何か問題が発生しました(サーバーがダウンしていて、ping応答さえ受信していません)。

7
Windows

rmコマンドの実行後にサーバーに到達できない可能性があることを忘れないでください。偶然かもしれません!

しかし、コマンドが発行されたとき、現在の作業ディレクトリはあなたが思っていたものではなかったと思われます。

これを行うとき、あなたは根を下ろしましたか?

これは、rm -rf *コマンドを発行するとどうなるかです。

  1. シェルは、ワイルドカードパターン(この場合は*)を、使用されるグロビングパターンに一致するすべてのファイル(この場合、ディレクトリ、シンボリックリンク、デバイス特殊ファイルを含む)に解決します。この場合、すべてが.で始まっていないすべて通常、これらは「アルファベット順に」ソートされますシェルによって。
  2. 次に、シェルは新しいプロセスをforkし、$PATHで最初に見つかったrmの最初のバージョンをexec() sします。最初の引数は-rfで、一致するファイルは1つずつ連続した引数です。

呼び出されたrmが標準のrmコマンドである場合、最初に引数を1つずつ解析し、-で始まるすべての引数(シェルグロビングの結果を含む)をオプションとして扱います。 -で始まらない引数になるまで(GNU getopt()を使用して非オプションの後にオプションを受け入れるコマンドを除く)、または正確に--のコマンドを除く。以降はすべてファイル名と見なされます。

つまり、現在のディレクトリに(たとえば)--no-preserve-rootというファイルがある場合、それは削除するファイル名ではなく、rmのオプションとして解釈されます。

ワイルドカード(およびファイルの命名)に注意してください。現在のディレクトリに-rというファイルがある場合、コマンドls *は他のファイルを逆の順序でリストし、「-r」ファイルを表示しません。

つまり、--no-preserve-rootというファイルがある場合、それはファイル名としてではなく、rmへのオプションとして渡されます。

rm -rf -- *を使用してそれが起こらないようにし、また-で始まるファイルを削除します。または、絶対パス名または相対パス名を使用して、-またはrm ./--flagfileのように、ファイル名をrm /abs/path/to/--flagfile以外で始まるようにします。

また、rmには-iフラグがあり、削除する前に(「インタラクティブに」)プロンプトを表示します。

11
MattBianco