特定のファイル形式fooを含むディレクトリを検索するには、「検索」を使用してください。

特定のファイル形式fooを含むディレクトリを検索するには、「検索」を使用してください。

私はいくつかのディレクトリを持っていますが、その中には3つの深さがあり、混在したファイルタイプが含まれています。私がしなければならないのは、rm -rffiletypeを含まないすべてのサブディレクトリですfoo

これはfind何とか達成できますか?私は次のようにfindを使用できることを知っています。

find . ! -name '*.foo' -delete

どの種類のファイルも含まれていないディレクトリ内のすべてのファイルを削除します*.foo。これで、不要なファイルだけでなく、含まれていないすべてのディレクトリとサブディレクトリも削除するにはどうすればよいですか*.foo

ベストアンサー1

(あなたの質問は不明です。ディレクトリにおよびsome.fooが含まれている場合はsome.bar削除する必要がありますか?私はこれをそのようなディレクトリを保存する必要があるという意味に解釈しました。)

ファイル名に改行文字が含まれておらず、ディレクトリが一致しない場合は、次の*.fooスクリプトが機能します。原則は、ディレクトリが葉から上に移動さ-depthれ、ファイル*.fooが見つかると、インクルードディレクトリとすべての親ディレクトリが表示されることですprotected。到着した保護されていないファイルは*.foo削除されるディレクトリです。トラバースの順序により、-depthディレクトリは常に*.foo保護できるファイルの後に到達します。警告:最小限のテストのみを行うと、削除による責任はechoあなたにあります。

find . -depth -name '*.foo' -o -type d | awk '{
    if ($0 ~ /\.foo$/) {
        while (sub("/+[^/]+$", "")) {protect[$0]=1;}
    } else {
        if (!protect[$0]) {
            gsub("[\\\001-/]", "\\\\&"); # protect file names for xargs
            print;
        }
    }
}' | xargs echo rm -rf

今回はzshソリューションを提案しません。

おすすめ記事