garbage
多くのファイルとディレクトリを含むディレクトリを考えてみましょう。を実行しましたが、そのrm -rf garbage
中のファイルやディレクトリの一部がgarbage
OS/NFS/etc で使用されているとrm -rf
失敗します。残りは削除されますか?それとも最初の失敗時に削除は停止されますか?現在、オペレーティングシステムはUbuntu 20.04ですが、興味深いのはこの動作が標準なのか、オペレーティングシステム(バージョン)によって異なりますか。
答え1
rm
行動詳細な規定は POSIX に提供されます。(あなたも見ることができます非常に大きなフォルダでrm -Rfを実行している間、実際の手順の順序は何ですか?完全なシーケンスを再現します)。現在のファイルを削除できない場合やファイルが存在しない場合は、
残りのファイルを処理し続けます。
これは、エラーが発生しても可能であればファイルを削除し続けることを意味します。これは、引数で指定されたファイルrm -rf
とディレクトリを処理したときに見つかったファイルの両方に適用されます。
場合によっては、仕事の結果を永遠に待つことができます(例えばNFSマウントからファイルを削除しようとすると(サーバーが応答しない)、最終的にノンストップスリープモード(状態D
)に切り替わりますが、その状態が解決したらファイルを削除し続けます。実際には決して止める削除するファイルが不足するまで削除してください。
答え2
rm -r
デフォルトでは、ファイル、ディレクトリ、シンボリックリンクなどであるかどうかにかかわらず(使用)、unlinkat
「ファイル」エントリのリンクを解除し、最初に見つかったディレクトリを繰り返し(たとえば使用getdents
)rm
検出したファイルを開いたり、読み書きしたりします。試している場合はまったくありません。つまり、中断せずに待機状態のディレクトリでI / O待機をトリガーしよrm
うとすると、続行する前に待機が解決されるのを待ちます。getdents
rm
つまり、rm
完了できない場合unlinkat
はケースごとに例外を処理します。たとえば、unlinkat
ファイルが見つからないために失敗すると、続行されますが報告rm
されます。ENOENT
No such file or directory