Kopieren Sie alle Dateien und Ordner mit Ausnahme von Subversion-Dateien und -Ordnern unter OS X

24732
Michael Prescott

Ich versuche, alle Dateien und Ordner von einem Verzeichnis in ein anderes zu kopieren, schließe aber bestimmte Dateien aus. Insbesondere möchte ich Subversion-Dateien und -Ordner ausschließen. Ich möchte jedoch eine allgemeine, aber prägnante Lösung.

Ich kann mir vorstellen, dass ich in naher Zukunft mehrere Dateitypen ausschließen muss. Ich möchte beispielsweise .svn, * .bak und * .prj ausschließen.

Hier ist, wofür ich mich so zusammengesetzt habe, aber es funktioniert nicht für mich. Der erste Teil, find works, aber ich mache etwas falsch mit xargs und cp . Ich habe versucht cp mit und ohne die -R. Auch ich bin mit OS X und es scheint eine weniger funktionsfähige Version zu haben, xargs als Linux - Systeme.

find ./sourcedirectory -not \( -name .svn -a -prune \) | xargs -IFILES cp -R FILES ./destinationdirectory 
14
Ich kann mich irren, aber ich denke, das ist schwieriger als Sie denken. Selbst wenn Ihr Befehl 'find' zum Ausschließen von .svn-Elementen ordnungsgemäß `-prune` verwendet, übergeben Sie das` -R`-Flag an `cp`, wodurch * dieser * Befehl rekursiv ist. Wenn Sie dies tun, verlieren Sie die Granularität, die Sie im Befehl "find" hatten. Ich bastele eine Minute damit herum, aber ich denke, die Antwort ist * nicht *, `-R` im` cp`-Befehl zu verwenden. Telemachus vor 14 Jahren 0
Es scheint für mich auf einem Linux-System zu funktionieren. Können Sie genauer sagen, was "es funktioniert nicht" bedeutet? Irgendwelche Fehlermeldungen? Dateien, die von Ihnen erwartet werden oder nicht kopiert werden? Dennis Williamson vor 14 Jahren 0
Es ist die "-R" -Flagge, ich bin mir ziemlich sicher. Entfernen Sie das und Sie sollten in Ordnung sein (obwohl Sie vielleicht -mindepth 1` hinzufügen möchten, um den Ordner der obersten Ebene zu ignorieren, den Sie nicht kopieren möchten, nehme ich an) Telemachus vor 14 Jahren 0
Normalerweise mache ich diese Dinge, indem ich alles kopiere und dann die unerwünschten Dateien in den Zielverzeichnissen lösche. Das ist oft viel einfacher. Jan Doggen vor 9 Jahren 0

9 Antworten auf die Frage

22
Doug Harris

(Nach erneutem Lesen der Frage bearbeitet. Fragender sagt, dass Rsync nicht installiert ist.)

Ein mögliches Problem bei Ihrer find / xargs-Lösung sind Leerzeichen in den Dateinamen. Um dies zu umgehen, weisen Sie find und xargs an, ein Nullzeichen (ASCII 0) zu verwenden, um die gefundenen Dateien zu trennen:

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

Wenn Sie feststellen, dass Rsync verfügbar ist, denke ich immer noch, dass Rsync die weitaus bessere Lösung ist:

Verwenden Sie rsync mit der Option -C. Auf der rsync-Manpage :

Dies ist eine nützliche Abkürzung, um eine Vielzahl von Dateien auszuschließen, die Sie häufig nicht zwischen Systemen übertragen möchten. Es verwendet einen ähnlichen Algorithmus wie CVS, um zu bestimmen, ob eine Datei ignoriert werden soll.

Dadurch wird rsync angewiesen, diese Muster zu ignorieren:

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/ 

Zum Beispiel:

rsync -avC /path/to/source/directory /path/to/destination/directory 

(Hinweis: Wenn Sie sich mit rsync noch nicht so gut auskennen, lesen Sie auf dieser Manpage unbedingt nach, wie rsync mit einem abschließenden Schrägstrich im Quellpfad umgeht. Es verhält sich anders, wenn Sie den Schrägstrich einfügen, als wenn Sie dies nicht tun. Suche nach 'nachlaufender Schrägstrich')

Oh Ratten, ich habe Ihre Frage noch einmal gelesen und gesehen, dass Sie gesagt haben, dass Sie Rsync nicht installiert haben. Auf meinem MacBook Pro (OS X 10.6.1) befindet es sich in / usr / bin / rsync. Es wurde für mich auch unter Tiger (10.4) und Leopard (10.5) installiert. Doug Harris vor 14 Jahren 0
Ich bin mir ziemlich sicher, dass Sie (und das OP) nicht das `-R`-Flag im` xargs`-Teil des Befehls wollen. Telemachus vor 14 Jahren 0
Guter Fang, ich habe das von der ursprünglichen Frage übernommen. Wird jetzt bearbeitet. Doug Harris vor 14 Jahren 0
Danke Doug! Eine Sache, die ich predige, "benutze das richtige Werkzeug für die Arbeit". Ich bin kürzlich aus der Windows-Welt zu OSX gekommen und fummle immer noch in Ignoranz herum. Ich stellte die gleiche Frage in einem Linux-Kanal und jemand sagte schnell, einfach "rsynch" verwenden. Ich habe "rsynch" in das Terminal eingegeben und sah, dass es nicht existierte xargs nähern. Ich bin ein bisschen hartnäckig. OSX hat jedoch standardmäßig "rsync" und Ihr Beitrag war sehr hilfreich. Ich habe noch nicht genug Erfahrung, um zu wissen, welche besser ist, aber Rsync ist sicher viel prägnanter. Vielen Dank! Michael Prescott vor 14 Jahren 1
Wenn Sie zusätzlich zu OS X auch mit Linux-Maschinen arbeiten, wird es Ihrer Meinung nach wert sein, rsync zu lernen. Seine Hauptfunktionalität ist das intelligente Kopieren nur der veränderten Daten (z. B. Robocopy unter Windows, wenn Sie damit vertraut sind). Da nur das Delta kopiert wird, ist dies eine großartige Möglichkeit, Sicherungen (ohne Zeitmaschine), Code-Implementierungen und ähnliches auszuführen. Doug Harris vor 14 Jahren 0
-C Flag löste so viele Probleme, die ich hatte ... nichts wie das Lesen der gesamten Manpage. Vielen Dank gcb vor 12 Jahren 0
2
Chris Nava

Keine allgemeine Lösung, aber ... Sie können den Befehl svn export verwenden, um eine Kopie des Arbeitsbereichs ohne die .svn-Metadatenordner zu erstellen.

Nicht um anstößig zu sein, aber ich bin nicht sicher, warum diese Antwort gewählt wird. Ich bin mir der Fähigkeiten von svn bewusst, aber "Ich hätte gerne eine allgemeine, aber prägnante Lösung. Ich denke, ich werde in naher Zukunft einige Dateitypen ausschließen müssen." Michael Prescott vor 14 Jahren 0
2
akira
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn | tar xvf - -C FOLDER_OUT ) 

Wenn Sie möchten, können Sie sogar "pv" oder etwas ähnliches zwischen den beiden Teerprozessen einfügen.

1
KeithB

Ich würde einen anderen Weg gehen, Teer und seinen Ausschlussmechanismus verwenden.

Von im Zielverzeichnis:

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

Dies wird als Quelle verwendet, der Inhalt wird tariert, die in der Ausschlussdatei aufgeführten Dateien werden ausgeschlossen und das aktuelle Verzeichnis wird freigegeben.

In der Tat eine elegante Lösung. Nick Stinemates vor 14 Jahren 0
Nun, es ist die gleiche Antwort, die ich später gegeben habe. Außerdem musst du im Zielverzeichnis sein ... :) akira vor 14 Jahren 0
1
michele

Ein schmutziger, aber schneller und prägnanter Weg:

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

Dies kopiert ein Verzeichnis in ein anderes (also die rekursive Option -r) und löscht dann alle genannten Namen rekursiv .svn(ohne Berücksichtigung von Groß- und Kleinschreibung).

0
Telemachus

Bearbeitete Antwort : Das Problem ist, dass -Rdas Kopieren rekursiv ist und Sie die versteckten Dateien kopieren. Folgendes würde ich verwenden:

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

Das -mindepth 1Flag weist finddarauf hin, das Verzeichnis der obersten Ebene zu ignorieren. Da Sie den gesamten Inhalt dieses Verzeichnisses in ein neues Verzeichnis der obersten Ebene kopieren möchten, gehe ich davon aus, dass Sie dies nicht möchten.

Wie Chris Nava in seiner Antwort sagt, gibt es bereits eine integrierte Möglichkeit, dies zu tun, wenn wir über SVN-Ordner sprechen. Da Sie jedoch nach einer allgemeineren Lösung gefragt haben, kann dies etwas helfen.

Danke Telemachus, es ist hilfreich. Ich habe nicht die Erfahrung zur Kritik, aber ich werde wiederholen, was mir seit meinem ursprünglichen Beitrag gesagt wurde. "xargs is broken" Der unbekannte irc-Kommentator, der mir gesagt hat, dass mich dazu inspiriert hat, sich etwas mehr umzusehen, und ich denke, Doug Harris 'Antwort spricht das Problem an. Das sagt xargs, dass es Nullzeichen verwenden soll. Ich denke das ist der -0 Schalter? Michael Prescott vor 14 Jahren 0
@Michael: `xargs` ist nicht defekt, aber auf Unix-ähnlichen Systemen werden standardmäßig keine Dateinamen (oder Verzeichnisnamen) mit Leerzeichen verwendet. Wenn Sie Leerzeichen oder "lustige" Zeichen in Ihren Dateinamen (oder Verzeichnisnamen) haben, müssen Sie zusätzliche Arbeit erledigen, um damit umzugehen. (In GNU `find 'gibt es wegen dieser Ausgabe einen ganzen Abschnitt auf der` man`-Seite mit dem Namen "UNUSUAL FILENAMES".) Die `-0`-Flagge in` xargs` und `-print0` für` find`-Hilfe handhaben diese probleme. Ich verspreche Ihnen jedoch, dass Sie in Ihrem Kopierbefehl nicht '-R' verwenden möchten. Alles was Sie tun, um die SVN-Verzeichnisse zu umgehen, wird rückgängig gemacht. Telemachus vor 14 Jahren 0
0
Steve Folly

Ich nehme an, es hängt davon ab, wie groß Ihr Baum ist, aber warum nicht zuerst alles kopieren und dann die .svn-Ordner trimmen:

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

?

Ohne ein Benchmarking ist mein erster Gedanke, dass dies eine doppelte Verschwendung von CPU-Zyklen ist: das Kopieren und das Entfernen. Es dauert möglicherweise etwas mehr Zeit, um den richtigen "find" -Befehl zu erstellen, aber das tun Sie nur einmal. Sie können den Befehl hunderte Male verwenden, wenn Sie ihn richtig verstanden haben. Telemachus vor 14 Jahren 0
@ Telemachus - stimmt, aber Computer können (sollen) gut sein - machen die kniffligen Sachen, damit wir nicht müssen! Wirklich - was für ein Schaden ist es, einige Dateien zu kopieren, um sie bald danach löschen zu lassen, wenn die Befehle, die Sie dafür erfinden, sehr einfach sind? Steve Folly vor 14 Jahren 0
@ Steve: Es ist wirklich kein Schaden. Soweit es geht, ist dies eine feine Lösung. Es folgt ein Prinzip, das mir gefällt: "Tun Sie die einfachste Sache, die funktioniert." Auf der anderen Seite verstößt es gegen ein anderes Prinzip, das mir noch mehr gefällt: "Lerne deine Werkzeuge." Ich würde es vorziehen zu lernen, wie man `find 'selbst besser einsetzt, so dass ich dies nicht tun musste. Aber Sie haben recht: Mit dieser Lösung stimmt nichts wirklich. Telemachus vor 14 Jahren 0
@ Telemachus: Ich stimme zu "Lerne deine Werkzeuge". Ich war mir sicher, dass mein Suchbefehl für mich damals sehr kryptisch ausgesehen hätte :-) Steve Folly vor 14 Jahren 0
0
Nick Stinemates

Vergiss nicht Grep -v

find . | grep -v .svn 
Dieser Befehl tut nicht das, was Sie denken. Juan A. Navarro vor 13 Jahren 0
0
devXen

Sie können auch das Gegenteil tun. Kopieren Sie alles und löschen Sie dann die .svn-Ordner mit dem folgenden Befehl:

find . | grep ".svn" | xargs rm -rf