
私はmacOSとrm
GNU 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
ファイルとディレクトリは下から上に検索され、ルートまで要求されたパスのリーフから削除されるため、これが重要です。何も残らないまでunlink
ingとingを実行し、最終ディレクトリを実行します。rmdir
rmdir
このようなことは順番に発生するため、 をエクスポートする前に、より多くのファイルが生成された場合にrmdir
戻りますENOTEMPTY
(「ディレクトリは空ではありません」)。
システムで実行されているスクリプトや他のプロセスと対話する可能性が高いですrm -rf
。
- 非同期式ではなく同期的に実行するか、
- ENOTEMPTYで失敗した場合は、もう一度お試しください。
rm -rf
(ディレクトリがその下から削除されたため、他のアプリケーションが失敗する可能性がありますが)
fanotify
opensnoop
同様のeBPFスクリプトを使用して、次のファイルを生成する他のアプリケーションを見つけることができます。隠された参照。inotify
役に立つかもしれませんが、残念ながら出力にファイルを生成するプロセスは含まれていません。
もう1つの可能性は、ファイルの削除に失敗しましたがブロックされている可能性があることです。この場合、どのエラーが発生する可能性があるかを確認するには、-f
ファイルなしで実行してみてください。-f
答え2
open $dir
以前に行った呼び出しは、削除したいディレクトリのサブディレクトリの1つでmacOS Finder(ファイルエクスプローラデスクトップアプリ)を実行することでした。
Directory not empty
削除しようとしているディレクトリにファイル/ディレクトリをロックするプロセスがある場合、macOSでこの不明な(ENOEMPTY)エラーが発生しているようです。