「検索」出力に基づいてディレクトリを削除する方法は?

「検索」出力に基づいてディレクトリを削除する方法は?

.svn ディレクトリを検索するには、次のコマンドを実行します。

find . -name ".svn"

これは私に次のような結果を与えます:

./toto/.svn
./toto/titi/.svn
./toto/tata/.svn

rm -frディレクトリとその内容を削除するには、これらの行をどのように処理する必要がありますか?

答え1

Findは、-exec見つかった各一致のオプションを含む引数を実行できます。スペース/改行やその他の文字を含むパスを正しく処理できるため、これは推奨されるメカニズムです。ディレクトリ自体を削除するには、まずディレクトリの内容を削除する必要があるため、これを行うには-rコマンドを使用します。rm

たとえば、次のように発行できます。

find . -name ".svn" -exec rm -r "{}" \;

findにのみfindと言うこともできます。目次確認を追加して-type d名前を.svnとして指定します。

find . -name ".svn" -type d -exec rm -r "{}" \;

警告するrm -r注意して使用すると、フォルダとその内容の両方が削除されます。

空のディレクトリと空のディレクトリのみを含むディレクトリのみを削除するには、-deletefindと次のいずれかを使用して直接削除できます-empty

find . -name ".svn" -type d -empty -delete

答え2

許容される回答よりも高速で移植可能な方法があります。

コマンドターミネーター+としてセミコロンの代わりにaを使用すると、CPU使用率を最適化できます。サブディレクトリがfind多い場合、これは重要です.svn

find . -name .svn -type d -exec rm -rf {} +

また、ここでは中括弧を引用する必要はありません。

1シェルを使用しない限りfish(この回答を作成してから変更された可能性があります)。

答え3

使用していると仮定検索、次のオプションがあります-delete

find . -name test -delete

これは覚えやすいです。

答え4

マイコンピュータで次を使用する場合:

find . \( -name dirname -type d \) -exec rm -r '{}' ';'

ディレクトリが削除されましたが、エラーが発生しました。

find: ‘./dirname’: No such file or directory

各ディレクトリに。

私のディレクトリは空ではないので、-deleteオプションは機能しません。この行動の理由を見つけましたここ:

  1. findは(必ずしもそうではありません)./ディレクトリの最初のエントリを取得します。たとえば、dir.1/
  2. 「dir。?」パターンと比較します。マッチ?はい。
  3. find は「rm -r dir.1」を実行します。
  4. find は、ディレクトリ内のパターンを見つけるために dir.1/ と入力しようとします。 execコマンドについては何も知りません。
  5. これ以上 dir.1/ が見つかりません。 ENOENTを返します(strace出力を参照)。

私はこれを解決するために以下を使用しました。

rm -r `find . -name dirname -type d`

findはまだdirnameというディレクトリに再帰しようとしますが、これは実際には必要ではなく、追加の時間がかかることに注意してください。ディレクトリ構造に応じ--depthて、検索オプションを使用してこの問題を解決できます。また、dirname/foo/dirname などのディレクトリ構造がある場合、rm に「該当するファイルまたはディレクトリがありません」というエラーが発生します。エラーを抑制するには、stderrを/ dev / nullにリダイレクトするか、-frm(force)フラグを使用できます。

関連情報