-deleteを使用してfindを実行すると、/ save /ディレクトリ内のファイルが削除されますが、deleteを使用せずに検索できなかったのはなぜですか?


20

のファイルを除く、現在のディレクトリツリーのすべてのファイルを削除しますsave。私はこのコマンドを実行しました:

 find . \( -name save -prune \) -o -type f -ls | grep /save/

そしてそれは何も見つかりませんでした。しかし、このコマンドを実行したとき:

 find . \( -name save -prune \) -o -type f -delete

/ save /内のこれらのファイルはすべて削除されました。私は何が欠けていますか?


4
痛い...今日は何かを学びました(ありがとう)。そして、私はそのmv save/ ../some/safer/locationような「一般的な」削除コマンドの前に単純なものをお勧めします(...もちろん、あなたの投稿の前に私は同じチェックをして同じトラブルに遭遇したでしょう!)。ファイルが存在するファイルシステムの適切な「復元」を見つけてください^^
オリビエデュラック

3
私の痛みはあなたの予防です。
オテウス

1
1000ありがとう。コード(多くの場合?)は神秘的な方法で動作します...
オリビエデュラック


@lesmana私はそこであなたの答えを支持しました。悲しいことに、私のバージョンのfindでは、このような素晴らしい警告は表示されません。(
Otheus

回答:


26

-delete-depth機能しないことを意味します-prune-depth葉から始まります)。これについては、GNUバージョンのマニュアルに警告-deleteがあります(GNU findおよび他のいくつかの実装でもサポートされているFreeBSD拡張機能です)。

info find --index-search=-delete

コマンドラインで「-delete」アクションを使用すると、「-depth」オプションが自動的にオンになります(* find finds ::に注意してください)。以前に「-print」でテストしていた場合、これは驚くべきことです。したがって、通常は「-depth」を明示的に使用することを忘れないでください。

info find --index-search=-prune

「-delete」は「-depth」を意味するため、「-prune」と「-delete」を組み合わせて使用​​すると、意図したよりも多くのファイルが削除される可能性があります。

ここでは、rm代わりに使用するオプションがあります:

find . -name save -prune -o -type f -exec rm -f {} +

(他のユーザーが書き込み可能なディレクトリがある場合、そのコマンドを実行中にディレクトリをシンボリックリンクに置き換えることにより、現在のディレクトリツリーの外部のファイルを削除する可能性があるため、安全ではない可能性があります)。

より安全な代替手段:

find . -name save -prune -o -type f -execdir rm -f -- {} \;

上記の問題はありませんが、rmファイルごとに1 つ実行することを意味します。これ--は、ファイル名の前にを付けるGNUの実装ではなく、FreeBSDの実装に必要です./

または、コスタスが提案したように:

LC_ALL=C find . ! -name save ! -path '*/save/*' -type f -delete

(しかし、それはまだ不必要にsaveディレクトリに降ります)

これLC_ALL=C*、バイトシーケンスと一致します(現在のロケールで有効な文字を形成しないものも含む)。エラーメッセージの言語(ユーザーの言語ではなく英語)に影響することに注意してください。


ここでのセキュリティ問題は何rmですか?
jrw32982はモニカをサポートします

@ jrw32982、マニュアル見つけるGNUへのリンクと編集を参照してください
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.