私のアプリケーションにあるエクスポートツールの使命の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 -fr
xargs
rm
それが受け入れることができるのと同じくらい多くの引数を渡すだけであるほど十分にインテリジェントです。したがって、100万個のファイルがある場合、rm
1,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 -rf
find . -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