アプリケーションディレクトリからすべての.svnディレクトリを削除する方法


192

私のアプリケーションにあるエクスポートツールの使命の1つは、.svnアプリケーションディレクトリツリーからすべてのディレクトリを削除することです。Linuxシェルでツリー全体を走査して.svnファイルを削除する再帰的なコマンドを探しています。

このスクリプトはSVNに関連しない他のファイル/ディレクトリ名に使用されるため、私はエクスポートを使用していません。私は次のようなことを試しました:

find . -name .svn | rm -fr

うまくいかなかった...


3
'xargs rm -rf'を使用する場合、コマンドは機能するはずです
Peter van der Heijden

1
また、ディレクトリを削除したいことを確認するために、削除コマンド「rm -rfi」を変更することもできます。
bedwyr 2009

ただし、xargsは使用しないでください。スペースが含まれているディレクトリでは問題が発生します。以下の説明に従って、findを使用します。
John Hunt

回答:


438

これを試して:

find . -name .svn -exec rm -rf '{}' \;

そのようなコマンドを実行する前に、私はしばしばこれを最初に実行したい:

find . -name .svn -exec ls '{}' \;

43
:ディレクトリ内のスペースまたはそのような文字があるかもしれない場合は、単一引用符の中に{}置く必要があるかもしれません find . -name .svn -exec rm -rf '{}' \;
mtoloo

38
このテストでは、私のbashでうまく機能:find . -name .svn -exec echo {} \;
Fedir RYKHTIK

6
echo / lsを最初に実行することは、この答えへの「プロ」タッチです。どんな愚か者もシステムを破壊することができます。
John Hunt

6
何をし{} \;ますか?
Jon Mitten、2015

3
を含む2番目のコマンドを実行するlsと、entries prop-base props text-base tmp出力が得られます...
Rasoul

51

あなたが書いたものは、改行で区切られたファイル名(およびパス)のリストをに送信しますrmが、rmはその入力をどうするかわかりません。コマンドラインパラメータのみが必要です。

xargs 通常は改行で区切られた入力を受け取り、それらをコマンドラインに配置するため、xargsを追加すると作業が完了します。

find . -name .svn | xargs rm -fr

xargsrmそれが受け入れることができるのと同じくらい多くの引数を渡すだけであるほど十分にインテリジェントです。したがって、100万個のファイルがある場合、rm1,000,000 / 65,000回実行される可能性があります(シェルがコマンドラインで65,002個の引数を受け入れることができる場合{65k files + 1 for rm + 1 for -fr})。

人が適切に指摘したように、以下も機能します:

find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

最初の2つの-execフォームは両方ともrm、削除される各フォルダーを呼び出します。したがって、1,000,000個のフォルダーrmがある場合、1,000,000回呼び出されます。これは確かに理想的ではありません。の新しい実装では、可能な限り多くの引数を受け入れることを示す表示でrmコマンドを終了できます。+rm

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

最後のfind / xargsバージョンはprint0を使用\0します。これにより、find は改行ではなくターミネータとして使用する出力を生成します。POSIXシステム\0ではファイル名以外の任意の文字を使用できるため、これは、引数が正しく渡されるrmか、実行されているアプリケーションを確認するための本当に最も安全な方法です。

さらに、ベースディレクトリではなく、ファイルが見つかったディレクトリから-execdir実行さrmれるaと、-depth深度が最初に開始されるa があります。


31

パイプ、xargs、execなどは必要ありません。

find . -name .svn -delete

編集:冗談です、明らかに内部で-delete呼び出します。unlinkat()そのため、unlinkまたはのようrmdirに動作し、ファイルを含むディレクトリの操作を拒否します。


54
1つの問題は、-deleteファイルが含まれている場合、ディレクトリに触れないことです。
Xeoncross 2012

2
述語に-forceフラグがないか、再帰的なフラグ-deleteがないため、この答えは役に立ちません。したがって、それはに戻ります|xargs rm -rf。これは-exec、醜いプレースホルダーとセミコロンでタイプするよりも醜くないです-exec rm -rf '{}' \;
Tomasz Gandor 2014年

13

.svn-directoryを削除するために提供された多くの回答があります。ただし、チェックアウトの代わりにエクスポートを実行すると、これらのディレクトリを最初から回避できることを付け加えておきます。

svn export <url>

+1、すでにsvnに組み込まれている場合、これをやり直す必要はありません。
パワーロード2009

1
このアプローチで私が見る唯一の問題は、バージョン管理されていないファイルをエクスポートで保持したい場合です。svn docsから、「すべてのローカル変更は保持されますが、バージョン管理されていないファイルはコピーされません。」
raidfive

@raidfive:通常、プロジェクトをそのまま使用できるように、使用するライブラリを含めて、すべての関連ファイルをバージョン管理下に置くことを好みます。このセットアップのバージョン管理されていないファイルはコンパイルされたバイナリであり、ビルドファイルの目標によって再作成されます。しかし、プロジェクトがバージョン管理されていないファイルに依存している場合、エクスポートは機能しません。
Mnementh

しかし...もっと一般的な答えが必要でした。.svnは最も一般的な例にすぎません。
Itay Moav -Malimovka

12

たくさん見たくない場合

find: `./.svn': No such file or directory

警告の場合は、-depthスイッチを使用します。

find . -depth -name .svn -exec rm -fr {} \;

10

Windowsでは、次のレジストリスクリプトを使用して、「SVNフォルダーの削除」を右クリックのコンテキストメニューに追加できます。それらの厄介なファイルを含む任意のディレクトリでそれを実行します。

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

きちんとしたトリック。OPには役に立たないが、感動したので+1!
rrhartjr 2013

これは素晴らしいです。ありがとう。私はこれが超古いことを知っていますが、何でも。とにかくそれが大好きです。
アンソニー

9

あなたはほとんどそれを持っていました。コマンドの出力をパラメーターとして別のコマンドに渡す場合は、xargsを使用する必要があります。追加-print0すると、スクリプトが空白を含むパスを処理できるようになります。

find . -type d -name .svn -print0|xargs -0 rm -rf

2
いくつかの共鳴のために結局はうまくいったものが見つかりました。-name .svn | xargs rm -rfあなたのバージョンは私に方向性を与えてくれました、ありがとう
Itay Moav -Malimovka


4

重要な問題として、.svnフォルダーを削除するためにシェルを利用したい場合、-depth引数が必要です。これは、findコマンドが削除されたばかりのディレクトリに入らず、たとえば次のようなエラーメッセージが表示されないようにするためです。

"find: ./.svn: No such file or directory"

その結果、以下のようなfindコマンドを使用できます。

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;

これは私が探していたものであり、正しい答えになるはずです。
ラッキータクシー2016


2

または、作業コピーを変更せずにコピーをエクスポートする場合は、rsyncを使用できます。

rsync -a --exclude .svn path/to/working/copy path/to/export

1
または、基本的に同じことを行うsvn export / path / to / repositoryを使用します。
カレブペダーソン

著者は特にsvnを使いたくないと言った。おそらく彼のターゲット環境にはsvnがインストールされていません。
pimlottc 2009
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.