私はいくつかのディレクトリを持っていますが、その中には3つの深さがあり、混在したファイルタイプが含まれています。私がしなければならないのは、rm -rf
filetypeを含まないすべてのサブディレクトリです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ソリューションを提案しません。