簡単ではないかもしれない興味深い問題があります。私はLinuxで「find」コマンドオプションを統合する方法を見つけようとしました。
デフォルトでは、アーカイブまたは削除する必要があるファイルのいくつかの例があるディレクトリツリーがあります。 .XX引数のために、すべてのファイルは同じ拡張子を共有します(ただし、アイデアは可能な限り一般的なので、すべてのファイルになることができます)。ファイルが特定のフォルダ内にある場所(例では常にYYYという)を除いて、ディレクトリツリーからすべての.XXファイルを削除したいと思います。
次の構造に従う必要があるとします(ここで、各サブディレクトリには、私が触れたり影響を与えたくない多くのファイルと私が使用するファイルを含めることができます)。
folder_root:
|
|--> Subdir_1/interesting_file_1.XX
|--> Subdir_1/interesting_file_2.XX
|--> Subdir_1/unrelated_interesting_file_1.AA
|--> Subdir_2
|--> Subdir_3/interesting_file_3.XX
|--> YYY/interesting_file_4.XX
|--> YYY//interesting_file_5.XX
私は残したい:
folder_root:
|
|--> Subdir_1/unrelated_interesting_file_1.AA
|--> YYY/interesting_file_4.XX
|--> YYY/interesting_file_5.XX
ディレクトリYYYはどこにでも存在し、多くのディレクトリがある可能性があるため、大規模な除外リストを作成するために手動で除外する必要があるディレクトリパスのリストを持つことは不可能です。
まず、基本的なFind
作業を行いました。次に、.XXファイルを含むディレクトリを出力にfind . -iname "*.XX"
追加する方法を検討しました。-printf "%h\n"
私がやろうとしているのは、出力リストを取得してそれを使用して削除プロセスについて知らせることです(場合によっては)。grep
一時ファイルへの出力からYYYフォルダを削除し、ループを使用してwhile read
各サブディレクトリの内外に移動してからpushd
(スイッチで検索を使用)、空のディレクトリをクリーンアップする簡単な方法を使用できると思いました。これで去った)。ただし、これは非常に大きな大きなハンマーを使用して非常に無駄に感じられ、特に潜在的に数百のサブディレクトリを処理するときにシステム集約的になる可能性があります。popd
find . -iname "*.XX" -delete
-empty
より柔軟で全体的に集中的で信頼性の低い「より良い」アプローチがあるかどうか疑問に思います(特に3〜4種類のファイルタイプに対して3〜4回実行する必要がある場合)。
おそらくそうではないかもしれませんが、一度尋ねる価値があります:)単純なハンマーでも大丈夫ですが、大きなハンマーを使用する理由は何ですか? ? :)
最後に、システムに追加のシェルコマンドを追加することはできません(私が使用するシステムはUbuntuとCentosが混在しているため)、可能であれば既存のコマンドセットを使用する必要があります(他のコマンドがないと仮定)。ツリーに加えてモジュールが取り付けられています)、わかっています)。私はこの質問が簡単な答えを見つけるならば、さまざまな状況で他の人に役立つほど明確で「一般的」であることを願っています。
ベストアンサー1
findはフルパス名を生成するので、Pushd Popdなどが必要だとは思わない。
ファイル名にキャリッジリターンとアスタリスクが含まれている場合、すべてのreadlineメソッドは興味深い結果を生成します。
一般的な解決策は、findを使用してすべての候補のnull終了リストを生成し、grep winnowを使用し、xargsを使用して実行することです。
find . -iname "*.XX" -print0 | grep -vzf keep_these.txt | xargs -0 echo rm -- # remove the echo to ACTUALLY delete files
「keep_these.txt」は、前後のスラッシュを含む1行に1つずつ除外するディレクトリのリストです。例:
/YYY/
/I love this directory/
ディレクトリを識別するために正規表現が必要ない場合(単に固定文字列)、-F
grepに追加してください。