-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
は*
、バイトシーケンスと一致します(現在のロケールで有効な文字を形成しないものも含む)。エラーメッセージの言語(ユーザーの言語ではなく英語)に影響することに注意してください。
mv save/ ../some/safer/location
ような「一般的な」削除コマンドの前に単純なものをお勧めします(...もちろん、あなたの投稿の前に私は同じチェックをして同じトラブルに遭遇したでしょう!)。ファイルが存在するファイルシステムの適切な「復元」を見つけてください^^