GNU/Linux >> Linux の 問題 >  >> Linux

検索で特定のサブディレクトリを除くすべてのファイルを削除しますか?

フォルダaでしばらくアクセスされなかったすべてのファイルを再帰的に削除したい 、サブフォルダー b内のすべてのファイルを除く 。

find a ( -name b -prune ) -o -type f -delete

ただし、エラーメッセージが表示されます:

find:-deleteアクションは自動的に-depthをオンにしますが、-depthが有効な場合は-pruneは
何もしません。とにかく続行したい場合は、
明示的に-depthオプションを使用してください。

-depthを追加する b内のすべてのファイルが発生します 含まれるべきであり、してはならない 起こります。

これを機能させるための安全な方法を知っている人はいますか?

承認された回答:

1つの方法は、 -exec rmを使用することです。 -deleteの代わりに 。

find a ( -name b -prune ) -o -type f -exec rm {} +

または、 -not -pathを使用します -pruneの代わりに :

find a -not -path "*/b*" -type f -delete

-pruneの理由の説明 -deleteと衝突します :

-deleteを使おうとすると文句を見つけます -pruneを使用 -delete -depthを意味します および-depth -pruneを作成します 効果がありません。

-depthがある場合とない場合の検索の動作を観察します :

$ find foo/
foo/
foo/f1
foo/bar
foo/bar/b2
foo/bar/b1
foo/f2

単一のディレクトリでの順序についての保証はありません。ただし、ディレクトリがその内容の前に処理されるという保証があります。 foo /に注意してください foo / *の前 およびfoo/ bar foo / bar / *の前 。

これは、 -depthで元に戻すことができます 。

$ find foo/ -depth
foo/f2
foo/bar/b2
foo/bar/b1
foo/bar
foo/f1
foo/

すべてのfoo/ *に注意してください foo /の前に表示されます 。 foo / barと同じ 。

詳細説明:

  • -整理 検索がディレクトリに降りるのを防ぎます。言い換えれば、 -prune ディレクトリの内容をスキップします。あなたの場合、 -name b -prune これは、findが bという名前のディレクトリに到達したときを意味します すべてのサブディレクトリを含むディレクトリをスキップします。
  • -深さ ディレクトリ自体の前にディレクトリの内容を処理するためにfindを作成します。つまり、findがディレクトリエントリ bを処理するまでに その内容はすでに処理されています。したがって、 -prune -depthでは効果がありません 事実上。
  • -削除 -depthを意味します そのため、最初にコンテンツを削除してから、空のディレクトリを削除できます。 -削除 空でないディレクトリの削除を拒否します。

代替方法の説明:

find a -not -path "*/b*" -type f -delete

これは覚えやすい場合とそうでない場合があります。

このコマンドは引き続きディレクトリbに移動します そして、のためだけにその中のすべてのファイルを処理します-ではありません それらを拒否します。ディレクトリbの場合、これはパフォーマンスの問題になる可能性があります 巨大です。

-path -nameとは動作が異なります 。 -名前 -path の間は、(ファイルまたはディレクトリの)名前とのみ一致します パス全体と一致しています。たとえば、パス / home / lesmana / foo / barを確認します。 。 -ネームバー 名前がbarであるため、一致します 。 -path "* / foo *" 文字列/foo であるため、一致します パスにあります。 -path 使用する前に理解しておくべき複雑な点がいくつかあります。 findのマニュアルページを読む 詳細については。

関連:ado -Find Meaning- Dictionary Lookup!

これは100%絶対確実ではないことに注意してください。 「誤検知」の可能性があります。上記のコマンドの記述方法では、名前が bで始まる親ディレクトリを持つファイルはスキップされます。 (ポジティブ)。ただし、名前が bで始まるファイルもスキップされます。 ツリー内の位置に関係なく(誤検知)。これは、 "* / b *"よりも優れた式を記述することで修正できます。 。それは読者の練習問題として残されています。

aを使用したと思います およびb プレースホルダーと本名はallosaurusに似ているため およびブラキオサウルスブラキオサウルスを入れた場合 bの代わりに そうすれば、誤検知の量が大幅に減少します。

少なくとも誤検知はではありません 削除されたので、それほど悲劇的ではありません。さらに、最初に -delete を指定せずにコマンドを実行することで、誤検知をチェックできます。 (ただし、暗黙の -depthを配置することを忘れないでください )そして出力を調べます。

find a -not -path "*/b*" -type f -depth

Linux
  1. 特定のサブパスを持つファイルを見つける方法は?

  2. 検索を使用して特定のディレクトリを検索し、1つのディレクトリを除くその中のすべてのファイルを削除しますか?

  3. Linuxで777権限を持つすべてのファイル/フォルダを見つける方法は?

  1. Linuxで.rbで終わるすべてのファイルを見つける方法は?

  2. 文字列を含む名前のすべてのファイルを検索

  3. 一部を除くディレクトリ内のすべてのファイルを削除する方法は?

  1. Centos –すべてのファイルの名前を特定の名前に変更しますか?

  2. 最後の(最新の)20を除くフォルダ内のすべてのファイルを削除しますか?

  3. nginx.conf を設定して、特定のファイルまたはディレクトリ以外のすべての接続を拒否します