OS X上のSubversionファイルとフォルダーを除くすべてのファイルとフォルダーをコピーします


14

あるディレクトリから別のディレクトリにすべてのファイルとフォルダをコピーしようとしていますが、特定のファイルを除外しています。具体的には、Subversionのファイルとフォルダーを除外します。ただし、一般的かつ簡潔なソリューションが必要です。

近い将来、いくつかの種類のファイルを除外する必要があると思います。たとえば、.svn、*。bak、および* .prjを除外できます。

ここに私がそのようにまとめたものがありますが、それは私にとってはうまくいきません。最初の部分、findは動作しますが、xargscpで何か間違ったことをしています。私はcpを試してみました-R。また、私はOS Xを使用していますが、Linuxシステムよりも機能が少ないバージョンのxargsがあるようです。

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory

私は間違っているかもしれませんが、これはあなたが考えるよりもトリッキーだと思います。findコマンドが-prune.svnアイテムを除外するために適切に使用している場合でも、そのコマンドに再帰的である-Rことcpを伝えるフラグを渡します。そうすると、コマンドに含まれていた細分性が失われます。私はこれを少しいじりますが、答えはコマンドで使用することではないと思います。find-Rcp
テレマコス

Linuxシステムで動作するようです。「機能していない」とはどういう意味ですか?エラーメッセージはありますか?期待どおりにファイルがコピーされる/されない
追って通知があるまで一時停止します。

それは-R旗です、私はかなり確信しています。あなたは大丈夫でなければならないことを削除(追加するかもしれませんが-mindepth 1、あなたがコピーしたくないトップレベルのディレクトリフォルダを無視するように、私は仮定)
テレマコス

私は通常、すべてをコピーしてから、ターゲットディレクトリ内の不要なファイルを削除することでこれらのことを行います。多くの場合、これははるかに簡単です。
ヤンDoggen

回答:


22

(質問を読み直した後に編集。質問者は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のmanページ

これは、システム間で転送したくないことが多い広範囲のファイルを除外するための便利な略記法です。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がソースパスの末尾のスラッシュをどのように処理するかについて、そのマニュアルページを必ずお読みください。スラッシュを含める場合としない場合の動作は異なります。 「末尾のスラッシュ」を検索)


ああ、ラット、私はあなたの質問を読み直しただけで、rsyncがインストールされていないと言っているのを見ました。MacBook Pro(OS X 10.6.1)では、/ usr / bin / rsyncにあります。Tiger(10.4)とLeopard(10.5)の下にもインストールされました。
ダグ・ハリス

私はあなた(そしてOP)がコマンドの一部に-Rフラグを付けたくないことを確信していますxargs
テレマコス

良いキャッチ、私は元の質問からそれをコピーしました。今すぐ編集します。
ダグ・ハリス

1
ダグありがとう!私が説く一つのことは、「仕事に適切なツールを使用する」ことです。私は最近、Windowsの世界からOSXに来ましたが、まだ無知でいじっています。この同じ質問をLinuxチャネルに投稿し、誰かがすぐに言った。「rsynch」を使用するだけで、ターミナルで「rsynch」と入力して、それが存在しないことがわかり、調査を続けた。xargsアプローチ。私はそのように少し頑固です。とにかく、OSXにはデフォルトで「rsync」があり、あなたの投稿はとても役に立ちました。ここでは、どちらが優れているかを知るのに十分な経験がありませんが、rsyncの方がはるかに簡潔です。ありがとう!
マイケルプレスコット

OS Xでの作業に加えてLinuxマシンでも作業を行う場合は、rsyncの使用方法を学ぶのに時間を費やす価値があると思います。その主な機能は、変更されたものだけをインテリジェントにコピーすることです(Windowsでのロボコピーなど、使い慣れている場合)。デルタのみをコピーするため、(Time Machine以外の)バックアップ、コードの展開などを処理するのに最適な方法です。
ダグ・ハリス

2

一般的な解決策ではありませんが、... svn exportコマンドを使用して、.svnメタデータフォルダーなしでワークスペースのコピーを作成できます。


不快ではありませんが、なぜこの答えが投票されるのかわかりません。私は「私は一般的な、まだ簡潔なソリューションが欲しい、私は近い将来にいくつかの種類のファイルを除外する必要性を見つけることができます想像してください。」のsvnの能力を認識してんだけど、
マイケル・プレスコット

2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

必要に応じて、2つのtarプロセスの間に「pv」などを配置することもできます。


2

汚いが、迅速かつ簡潔な方法:

cp -r source destination
find destination -iname .svn |xargs rm -rf

これにより、1つのディレクトリが別のディレクトリにコピーされ(したがって再帰オプション-r)、名前の付いたものはすべて再帰的に消去されます.svn(大文字と小文字は無視されます)。


1

tarとその除外メカニズムを使用して、別の方法でそれを実行します。

宛先ディレクトリから:

tar -X excludefile -C source -f - . | tar xf -

これはソースにcdし、excludefileにリストされているものを除外して内容をtarで圧縮し、それを現在のディレクトリにuntarします。


確かにエレガントなソリューション。
ニックスタインメイツ

まあ、それはちょうど私が与えたのと同じ答えです。さらに、宛先ディレクトリにいる必要があります... :)
akira

0

編集された答え:問題は-R、コピーが再帰的になり、隠しファイルをコピーしてしまうことです。私が使用するものは次のとおりです。

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1フラグが伝えますfind、トップレベルディレクトリを無視するようにします。そのディレクトリのすべてのコンテンツを新しいトップレベルディレクトリにコピーしたいので、私はあなたがそれを望まないと仮定します。

Chris Navaが答えで述べているように、 SVNフォルダーについて話している場合、これを行うための組み込みの方法は既にありますが、より一般的なソリューションを求めたので、これは少し役立つかもしれません。


Telemachusに感謝します。私は批判する経験はありませんが、元の投稿以来、私が言われたことを繰り返します。「xargs is broken」不明なircのコメンターは、私にもう少し見て回ることを促し、ダグハリスの答えが問題に対処していると私に言った。それは、ヌル文字を使用するようにxargsに指示します。私はそれが-0スイッチだと思いますか?
マイケルプレスコット

@Michael:xargs壊れていませんが、Unixライクなシステムでは、デフォルトではファイル名(またはディレクトリ名)にスペースが含まれていません。ファイル名(またはディレクトリ名)にスペースまたは「面白い」文字が含まれている場合は、それに対処するために特別な作業を行う必要があります。(ではGNUはfind、全体セクションがありますmanので、この問題の「UNUSUAL FILENAMES」というページ。)-0中のフラグxargs-print0のためにfind、これらの問題に対処するのに役立ちます。ただし、-Rコピーコマンドでは使用しないことをお約束します。SVNディレクトリを回避するために行うことはすべて取り消されます。
テレマコス

0

ツリーの大きさに依存すると思いますが、まずすべてをコピーしから、.svnフォルダーをトリミングしないでください:

find /dest-dir -type d -name .svn -exec rm -rf {} \;


ベンチマークなしで、私の最初の考えは、これがCPUサイクルの二重の無駄、つまりコピーと削除であると考えています。適切なfindコマンドを作成するには、人間の時間が少し余分にかかる場合がありますが、それは一度だけです。コマンドを正しく使用すれば、何百回も使用できます。
テレマコス

@Telemachus-本当ですが、それはコンピューターが得意なものです(そうだと思われます)-トリッキーなことをするので、そうする必要はありません!本当に-あなたがそれを行うために発明したコマンドが非常に簡単であることを意味する場合、すぐにそれらを削除するためだけにいくつかのファイルをコピーすることにどんな害がありますか?
スティーブフォリー

@Steve:本当に害はありません。それが行く限り、これは素晴らしい解決策です。私が気に入っている原則の1つです。「可能な限り単純なことを行う」。一方で、私がさらに気に入っているもう1つの原則「ツールを学ぶ」に違反しています。これを使用findする必要がないように、自分自身をよりよく使用する方法を学びたいと思います。しかし、あなたは正しい:この解決策に本当に悪いことは何もない。
テレマコス

@Telemachus:「ツールを学ぶ」に同意します。私が始めたとき、上の私の検索コマンドは私にとって非常に謎めいたものであったと確信しています:
スティーブフォリー


0

逆のこともできます。すべてをコピーしてから、以下のコマンドを使用して.svnフォルダーを削除します。

find . | grep ".svn" | xargs rm -rf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.