私のアプリケーションにあるエクスポートツールの使命の1つは、.svnアプリケーションディレクトリツリーからすべてのディレクトリを削除することです。Linuxシェルでツリー全体を走査して.svnファイルを削除する再帰的なコマンドを探しています。
このスクリプトはSVNに関連しない他のファイル/ディレクトリ名に使用されるため、私はエクスポートを使用していません。私は次のようなことを試しました:
find . -name .svn | rm -frうまくいかなかった...
私のアプリケーションにあるエクスポートツールの使命の1つは、.svnアプリケーションディレクトリツリーからすべてのディレクトリを削除することです。Linuxシェルでツリー全体を走査して.svnファイルを削除する再帰的なコマンドを探しています。
このスクリプトはSVNに関連しない他のファイル/ディレクトリ名に使用されるため、私はエクスポートを使用していません。私は次のようなことを試しました:
find . -name .svn | rm -frうまくいかなかった...
回答:
これを試して:
find . -name .svn -exec rm -rf '{}' \;そのようなコマンドを実行する前に、私はしばしばこれを最初に実行したい:
find . -name .svn -exec ls '{}' \;find . -name .svn -exec rm -rf '{}' \;
                    find . -name .svn -exec echo {} \;
                    {} \;ますか?
                    lsと、entries  prop-base  props  text-base  tmp出力が得られます...
                    あなたが書いたものは、改行で区切られたファイル名(およびパス)のリストをに送信しますrmが、rmはその入力をどうするかわかりません。コマンドラインパラメータのみが必要です。
xargs 通常は改行で区切られた入力を受け取り、それらをコマンドラインに配置するため、xargsを追加すると作業が完了します。
find . -name .svn | xargs rm -frxargsrmそれが受け入れることができるのと同じくらい多くの引数を渡すだけであるほど十分にインテリジェントです。したがって、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 があります。
パイプ、xargs、execなどは必要ありません。
find . -name .svn -delete編集:冗談です、明らかに内部で-delete呼び出します。unlinkat()そのため、unlinkまたはのようrmdirに動作し、ファイルを含むディレクトリの操作を拒否します。
-deleteファイルが含まれている場合、ディレクトリに触れないことです。
                    -forceフラグがないか、再帰的なフラグ-deleteがないため、この答えは役に立ちません。したがって、それはに戻ります|xargs rm -rf。これは-exec、醜いプレースホルダーとセミコロンでタイプするよりも醜くないです-exec rm -rf '{}' \;。
                    .svn-directoryを削除するために提供された多くの回答があります。ただし、チェックアウトの代わりにエクスポートを実行すると、これらのディレクトリを最初から回避できることを付け加えておきます。
svn export <url>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\" \""あなたはほとんどそれを持っていました。コマンドの出力をパラメーターとして別のコマンドに渡す場合は、xargsを使用する必要があります。追加-print0すると、スクリプトが空白を含むパスを処理できるようになります。
find . -type d -name .svn -print0|xargs -0 rm -rffind . -name .svn |xargs rm -rf重要な問題として、.svnフォルダーを削除するためにシェルを利用したい場合、-depth引数が必要です。これは、findコマンドが削除されたばかりのディレクトリに入らず、たとえば次のようなエラーメッセージが表示されないようにするためです。
"find: ./.svn: No such file or directory"その結果、以下のようなfindコマンドを使用できます。
cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;または、作業コピーを変更せずにコピーをエクスポートする場合は、rsyncを使用できます。
rsync -a --exclude .svn path/to/working/copy path/to/export