web-dev-qa-db-ja.com

名前に一致するフォルダーからすべてのファイルを再帰的に削除するコマンド?

ベースフォルダーがあります(ベースと呼びましょう)。

内部にはたくさんのフォルダーがあり、これらのフォルダー内のさまざまな深さにキャッシュフォルダーが散在しています。

キャッシュフォルダー内からすべてのファイルを削除しますが、フォルダー自体は削除しません。

私が試してみました

cd base
#then one of...
Sudo rm -rf cache/*
Sudo rm -rf *cache/*
Sudo rm -rf cache*/*
Sudo rm -rf *cache*/*

しかし、本当に推測しているだけで、正しいコマンドは何でしょうか?

4
Hailwood

Bashでは、globstarを有効にし、**を使用して再帰的にディレクトリを一致させることができます

shopt -s globstar
echo rm -rf ./**/*cache*/*

パターンマッチング を参照してください

8
geirha

これにより、cacheという名前のフォルダー内のフォルダーbaseから始まるすべてのファイルが再帰的に削除されます。 cacheフォルダー自体はそのままですが、各フォルダー内のすべてのファイルが削除されます。

find base -ipath "*/cache/*" -type f -delete
3
Flint

extremely強力な検索コマンドを使用できます。

私はこのようなものを使用します:

find . -iname *cache* -ok rm -rf {} \;

それでは、あなたに説明させてください。 Findはアプリケーションの名前であり、多くのオプションがありますが、あなたにとってはそれらの多くは必要ありません。

.は、この現在のディレクトリを検索することを意味します。つまり、最初に正しいディレクトリにいる必要があります。それは~だと思います

-inameは、大文字と小文字を区別しない名前を検索することを意味します。

*cache*は、名前にキャッシュを含める必要があることを意味します。

今、次の部分は重要です。

-okは、後続のコマンドを実行することを意味しますが、最初に実行したい場合は私として実行します。これは-execに置き換えることができますが、お勧めしません。それはあなたに告げずに物事を削除し、あなたはそれを望まないでしょう。

さて、次の行(-okが実行するもの)はrm -rf {} \;です

rm -rfは自明であることを願っています。 {}は基本的に、見つかったファイルの名前のプレースホルダーです。末尾の\;は、その行の終わりであることを意味します。

それが理にかなっていることを願っています。

-okを含むすべての権利なしでfindコマンドを実行することをお勧めします。最初にすべてのキャッシュファイルのリストをポンプで出力し、それらを確認できます。次に-okセクションを追加して、クラックを取得します!

1
SuperMatt

Basedirを、削除するベースディレクトリのパスに置き換えるだけです

$ find basedir -type f -delete

以前にベースディレクトリに移動する方が快適だと感じた場合:

$ cd basedir
$ find . -type f -delete
1
jap1968