「rm -rf」を使用すると、「ディレクトリが空ではありません」というメッセージが表示されるのはなぜですか?

「rm -rf」を使用すると、「ディレクトリが空ではありません」というメッセージが表示されるのはなぜですか?

私はmacOSとrmGNU coreutils(macOS独自のツールではないrm)のツールを使用しています。

そのため、次のようないくつかのディレクトリをクリーンアップするスクリプトがあります。

if [ -d "${cleanup_repo_clone_root}" ]; then
    echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"
    set -x; rm -rf -- "${cleanup_repo_clone_root}"
fi

私はset -x何が起こったか見るために1つを投げた。

出力が表示されます。

+ set -x
+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ
rm: cannot remove '/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ': Directory not empty

しかし、対応するrmコマンドをコピーして貼り付けて実行すると正常に動作します!

$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ

ここで何が起こっているのでしょうか?

ベストアンサー1

rm複数のファイルやディレクトリで作業するときの作業はアトミックではありません。この場合、rm -rファイルとディレクトリは下から上に検索され、ルートまで要求されたパスのリーフから削除されるため、これが重要です。何も残らないまでunlinkingとingを実行し、最終ディレクトリを実行します。rmdirrmdir

このようなことは順番に発生するため、 をエクスポートする前に、より多くのファイルが生成された場合にrmdir戻りますENOTEMPTY(「ディレクトリは空ではありません」)。

システムで実行されているスクリプトや他のプロセスと対話する可能性が高いですrm -rf

  1. 非同期式ではなく同期的に実行するか、
  2. ENOTEMPTYで失敗した場合は、もう一度お試しください。rm -rf(ディレクトリがその下から削除されたため、他のアプリケーションが失敗する可能性がありますが)

fanotifyopensnoop同様のeBPFスクリプトを使用して、次のファイルを生成する他のアプリケーションを見つけることができます。隠された参照inotify役に立つかもしれませんが、残念ながら出力にファイルを生成するプロセスは含まれていません。

もう1つの可能性は、ファイルの削除に失敗しましたがブロックされている可能性があることです。この場合、どのエラーが発生する可能性があるかを確認するには、-fファイルなしで実行してみてください。-f

おすすめ記事