find -execを使用してディレクトリを削除するとエラーメッセージが生成されるのはなぜですか?

find -execを使用してディレクトリを削除するとエラーメッセージが生成されるのはなぜですか?

なぜこれが起こるのか:

find . -type d -name test -exec rm -r {} \;

エラーメッセージの生成:

find: ./foo/test: No such file or directory
find: ./bar/test: No such file or directory
find: ./blech/test: No such file or directory

実際にそのディレクトリを削除しても?

OS X(10.10)の場合です。

答え1

readdir()検索はディレクトリからコンテンツを取得するために使用されます。

readdir() はキャッシュを実装するライブラリ関数であり、findキャッシュがなくても、呼び出されたプログラムが見つけたディレクトリを削除したかどうかを知る方法がないため、標準の検索呼び出しは常にこの種のエラーを発生させます。

問題に対するクリーンな解決策があります。

find . -depth ...

(...をfindコマンドラインの残りの部分に置き換えます)

findディレクトリ自体の前に、すべてのディレクトリの内容を処理するように指示します。

find注:マニュアルページを読むことをお勧めします。 26年間、遅く-exec ... {} \;てクリックするたびにサブプロセスを作成するより良いソリューションがありました。-exec ... {} +引数の最大サイズに達するまで、パス名を収集しながら探します。

答え2

元の質問

-exec最大の後ろのすべての単語は\;引数として解釈されます。つまり、コマンドを実行するシェルによって拡張されますが(名前付き{}ディレクトリが存在する場合はどうなるかを試すことができます)、それから引用形式として解釈されます。 globを拡張するにはシェルが必要です。

find . -type d -exec bash -c 'echo {}/*' \;

修正する

ディレクトリを削除するときに親ディレクトリを削除した後、そのサブディレクトリを削除することはできません。サブディレクトリは消えた。

関連情報