すべてのファイルとフォルダをあるディレクトリから別のディレクトリにコピーしようとしていますが、特定のファイルを除外しています。具体的には、Subversionのファイルとフォルダーを除外したいと思います。しかし、私は一般的でありながら簡潔な解決策を求めています。
近い将来、いくつかの種類のファイルを除外する必要があると思います。たとえば、.svn、*。bak、および* .prjを除外したい場合があります。
これが私がそのようにまとめたものですが、それは私にとってはうまくいきません。最初の部分は、動作を見つけますが、xargsおよびcpで何か問題があります。 cp-R
の有無にかかわらず試してみました。また、私はOS Xを使用していますが、Linuxシステムよりも機能の少ないバージョンのxargsがあるようです。
find ./sourcedirectory -not \( -name .svn -a -Prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
(質問を再度読んだ後に編集。質問者はrsyncがインストールされていないと言っています)
Find/xargsソリューションで起こりうる問題は、ファイル名にスペースがあることです。これを回避するには、findとxargsにヌル文字(ASCII 0)を使用して見つかったファイルを区切るように指示します。
find ./sourcedirectory -not ( -name .svn -a -Prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory
Rsyncが利用可能であることがわかった場合でも、rsyncの方がはるかに優れたソリューションだと思います。
-Cオプションを指定してrsyncを使用します。 rsyncのマニュアルページ から:
これは、システム間で転送したくないことが多い広範囲のファイルを除外するための便利な省略形です。 CVSと同様のアルゴリズムを使用して、ファイルを無視するかどうかを決定します。
これにより、rsyncはこれらのパターンを無視するようになります。
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/
例えば:
rsync -avC /path/to/source/directory /path/to/destination/directory
(注:rsyncに慣れていない場合は、rsyncがソースパスの末尾のスラッシュをどのように処理するかについて、そのマニュアルページを必ずお読みください。スラッシュを含める場合と含めない場合の動作は異なります。 '末尾のスラッシュ'を検索)
汚いが迅速かつ簡潔な方法:
cp -r source destination
find destination -iname .svn |xargs rm -rf
これにより、あるディレクトリが別のディレクトリにコピーされ(したがって、再帰オプション-r
)、次に.svn
という名前のすべてが再帰的に消去されます(大文字と小文字は区別されません)。
一般的な解決策ではありませんが... svn exportコマンドを使用して、.svnメタデータフォルダーなしでワークスペースのコピーを作成できます。
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn | tar xvf - -C FOLDER_OUT )
必要に応じて、2つのtarプロセスの間に「pv」または同様のものを配置することもできます。
私はtarとその除外メカニズムを使用して、別の方法でそれについて考えます。
宛先ディレクトリから:
tar -X excludefile -C source -f - . | tar xf -
これにより、ソースにcdし、excludefileにリストされているものを除いてコンテンツをタールアップしてから、現在のディレクトリに解凍します。
逆のこともできます。すべてをコピーしてから、以下のコマンドを使用して.svnフォルダーを削除します。
find . | grep ".svn" | xargs rm -rf
忘れないでくださいgrep -v
find . | grep -v .svn
編集された回答:問題は-R
はコピーを再帰的にするので、隠しファイルをコピーすることになります。これが私が使うものです:
find source/ -mindepth 1 -not \( -name .svn -Prune \) | xargs -Iitem cp item target/
-mindepth 1
フラグは、トップレベルディレクトリを無視するようにfind
に指示します。そのディレクトリのすべてのコンテンツを新しいトップレベルディレクトリにコピーしたいので、私はあなたがそれを望まないと思います。
Chris Navaが 彼の答えで と述べているように、SVNフォルダーについて話している場合、これを行う組み込みの方法はすでにありますが、より一般的な解決策を求めたので、これは少し役立つかもしれません。
私はそれがあなたのツリーの大きさに依存すると思いますが、なぜeverythingを最初にコピーし、その後に.svnフォルダをトリミングしないのですか?
find /dest-dir -type d -name .svn -exec rm -rf {} \;
?