.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
注意して使用すると、フォルダとその内容の両方が削除されます。
空のディレクトリと空のディレクトリのみを含むディレクトリのみを削除するには、-delete
findと次のいずれかを使用して直接削除できます-empty
。
find . -name ".svn" -type d -empty -delete
答え2
許容される回答よりも高速で移植可能な方法があります。
コマンドターミネーター+
としてセミコロンの代わりにaを使用すると、CPU使用率を最適化できます。サブディレクトリがfind
多い場合、これは重要です.svn
。
find . -name .svn -type d -exec rm -rf {} +
また、ここでは中括弧を引用する必要はありません。
1シェルを使用しない限りfish
(この回答を作成してから変更された可能性があります)。
答え3
答え4
マイコンピュータで次を使用する場合:
find . \( -name dirname -type d \) -exec rm -r '{}' ';'
ディレクトリが削除されましたが、エラーが発生しました。
find: ‘./dirname’: No such file or directory
各ディレクトリに。
私のディレクトリは空ではないので、-deleteオプションは機能しません。この行動の理由を見つけましたここ:
- findは(必ずしもそうではありません)./ディレクトリの最初のエントリを取得します。たとえば、dir.1/
- 「dir。?」パターンと比較します。マッチ?はい。
- find は「rm -r dir.1」を実行します。
- find は、ディレクトリ内のパターンを見つけるために dir.1/ と入力しようとします。 execコマンドについては何も知りません。
- これ以上 dir.1/ が見つかりません。 ENOENTを返します(strace出力を参照)。
私はこれを解決するために以下を使用しました。
rm -r `find . -name dirname -type d`
findはまだdirnameというディレクトリに再帰しようとしますが、これは実際には必要ではなく、追加の時間がかかることに注意してください。ディレクトリ構造に応じ--depth
て、検索オプションを使用してこの問題を解決できます。また、dirname/foo/dirname などのディレクトリ構造がある場合、rm に「該当するファイルまたはディレクトリがありません」というエラーが発生します。エラーを抑制するには、stderrを/ dev / nullにリダイレクトするか、-f
rm(force)フラグを使用できます。