「find-delete」が「-depth」を意味するのはなぜですか?

5
2022.01.08

GNU findのmanページには、はっきりと-deleteを使用すると、-depthを意味することを警告しています。ただし、この要件の説明が見つかりません。

-deleteファイルを削除します。削除が成功した場合はtrue。削除に失敗した場合は、エラーメッセージが発行されます。 […] -deleteを使用すると、-depthオプションが自動的にオンになります。

 find --version
find (GNU findutils) 4.8.0

これは暗黙的に注文後のウォークです。

 find /path -type f -delete

しかし、これはプレオーダーウォークであり、 findの通常のトラバーサル方法です。

 find /path -type f -exec rm -f {} +

私は-prune Iを使用したい場合は、-deleteを使用することはできませんし、代わりに私が面倒-exec rm {} +を使用する必要があり、まだ正味の効果は同じようです。

ディレクトリを削除しません-deleteアクションは、なぜfind -deleteの必要性は、-depthを意味するのでしょうか?

回答
9
2022.01.08

-deleteアクションは、ディレクトリを削除しません、なぜ-depthを暗示する-deleteの必要性を見つけるのですか?

GNUユーティリティの場合、リファレンスドキュメントはユーティリティの情報ファイルであり、マニュアルページではありません。場合によっては、質問で引用されているマニュアルページは誤解を招く可能性があります。 find -deleteはディレクトリを削除できます

ファイルまたはディレクトリを削除します。削除が成功した場合はtrue。削除に失敗した場合は、エラーメッセージが発行されます。

-deleteは、2004年にGNU findfindutils 4.2.3)に導入されて以来、常にディレクトリの削除をサポートしてきました。

それしかでき、削除、ディレクトリ、それは以前にそれらを空にしている場合:ディレクトリを削除すると、-delete-depthを意味した理由です。ディレクトリの-deleteは、rmdirrm -rf同等ではありません。

find /path -type f -deletefind /path -type f -exec rm -f {} +の正味の効果は同じです。これは、両方のfind呼び出しがアクションをファイルに制限するためです。ファイルのみが削除されるため、ファイルが削除される順序はfindのトラバーサルに影響しません。ディレクトリを削除すると、 findのトラバーサルが機能します。 -deleteがディレクトリで使用されている場合、ディレクトリ自体を削除する前に、ディレクトリの子がすべて処理されている必要があります。ここで-depthが役立ちます。トラバースされるディレクトリでrm -rfが使用されている場合、削除されたディレクトリの子をトラバースしようとする前に、に削除について通知する必要があります。これは、-pruneが役立つ1つの例です。

ディレクトリを削除しない場合に-depthが設定されないように特別なケースを作成することを想像できますが、一般的なケースでは事前に決定することは不可能です。 ( -depthはオプションであり、アクションではありません。最初のアクションが実際に処理される前に設定する必要があります。)

あるいは、過去に提案されたように-deleteを特別に処理する必要がなく、ユーザーが-deleteが必要なときにその仕事を行えるようにすることをユーザーに任せることを想像することもできます。ただし、これにより、 をコピーした他の実装との下位互換性と互換性が失われます。サバンナのバグ#20865の説明も参照してください。

GNU findutilsは、明示的に-pruneと組み合わせる-deleteをチェックし、バージョン4.3.11以降、およびアボート-depthが明示的に設定されていない場合。コメントは次のように述べています

-delete述語がPOSIXにないため、これを回避するだけです。もしそうなら、ここで致命的なエラーを出すことはできませんでした。

「-deleteで検索」で説明したように、 「削除なしで検索」でファイルを見つけることができなかったのに、/ save /ディレクトリ内のファイルが消去されたのはなぜですか? 、GNU findを使用している場合は、 -execdir rm {} +の代わりに-exec rm {} +を使用する必要があります。