Ich versuche, alle Dateien und Ordner von einem Verzeichnis in ein anderes zu kopieren, schließe jedoch bestimmte Dateien aus. Insbesondere möchte ich Subversion-Dateien und -Ordner ausschließen. Ich hätte jedoch gerne eine allgemeine und dennoch prägnante Lösung.
Ich stelle mir vor, dass ich in naher Zukunft mehrere Dateitypen ausschließen muss. Zum Beispiel möchte ich vielleicht .svn, * .bak und * .prj ausschließen.
Hier ist, was ich so zusammengestellt habe, aber es funktioniert nicht für mich. Der erste Teil, finde funktioniert, aber ich mache etwas falsch mit xargs und cp . Ich habe versucht , cp mit und ohne -R
. Außerdem verwende ich OS X und es scheint, dass es eine weniger funktionsfähige Version von xargs als Linux-Systeme gibt.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
Befehl ordnungsgemäß-prune
zum Ausschließen von .svn-Elementen verwendet wird, übergeben Sie das-R
Flag,cp
das angibt, dass dieser Befehl rekursiv sein soll. Wenn Sie dies tun, verlieren Sie die Granularität, die Sie imfind
Befehl hatten. Ich bin mit diesem für eine Minute zu basteln gehen, aber ich denke , die Antwort ist nicht auf den Einsatz-R
in demcp
Befehl.-R
Flagge, da bin ich mir ziemlich sicher. Entfernen Sie das und Sie sollten in Ordnung sein (obwohl Sie vielleicht hinzufügen möchten, um-mindepth 1
den obersten Ordner zu ignorieren, den Sie nicht kopieren möchten, nehme ich an)Antworten:
(Nach dem erneuten Lesen der Frage bearbeitet. Der Fragesteller sagt, dass rsync nicht installiert ist.)
Ein mögliches Problem mit Ihrer find / xargs-Lösung sind Leerzeichen in den Dateinamen. Um das zu umgehen, weisen Sie find und xargs an, ein Nullzeichen (ASCII 0) zu verwenden, um die gefundenen Dateien zu trennen:
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. Von der rsync-Manpage :
Dadurch wird rsync angewiesen, diese Muster zu ignorieren:
Beispielsweise:
(Hinweis: Wenn Sie noch nicht mit rsync vertraut sind, lesen Sie auf dieser Manpage, wie rsync mit einem abschließenden Schrägstrich im Quellpfad umgeht. Wenn Sie den Schrägstrich einfügen, verhält es sich anders als wenn Sie es nicht tun. Search for 'abschließender Schrägstrich')
quelle
-R
Flag imxargs
Teil des Befehls nicht wollen .Keine allgemeine Lösung, aber ... Sie können den Befehl svn export verwenden, um eine Kopie des Arbeitsbereichs ohne die .svn-Metadatenordner zu erstellen.
quelle
Wenn Sie möchten, können Sie sogar "pv" oder ähnliches zwischen die beiden Teerprozesse setzen.
quelle
Eine schmutzige, aber schnelle und prägnante Art:
Dies kopiert ein Verzeichnis in ein anderes (daher die rekursive Option
-r
) und löscht dann rekursiv alle Namen.svn
(Groß- / Kleinschreibung wird ignoriert).quelle
Ich würde es anders machen, indem ich Teer und seinen Ausschlussmechanismus benutze.
Von im Zielverzeichnis:
Dies führt dazu, dass die Quelle ausgewählt wird, der Inhalt unter Ausschluss der in Ausschlussdatei aufgeführten Elemente tariert und anschließend in das aktuelle Verzeichnis entpackt wird.
quelle
Bearbeitete Antwort : Das Problem ist, dass
-R
das Kopieren rekursiv wird und Sie am Ende die versteckten Dateien kopieren. Folgendes würde ich verwenden:Das
-mindepth 1
Flag weistfind
an, 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 ein wenig helfen.
quelle
xargs
ist nicht defekt, aber auf Unix-ähnlichen Systemen werden standardmäßig keine Dateinamen (oder Verzeichnisnamen) mit Leerzeichen darin verwendet. Wenn Ihre Dateinamen (oder Verzeichnisnamen) Leerzeichen oder "lustige" Zeichen enthalten, müssen Sie zusätzliche Arbeit leisten, um damit umzugehen. (In GNUfind
gibt esman
wegen dieses Problems einen ganzen Abschnitt auf der Seite mit dem Namen "UNUSUAL FILENAMES".) Das-0
Flag inxargs
und-print0
fürfind
Hilfe zur Behandlung dieser Probleme. Ich verspreche Ihnen jedoch, dass Sie-R
in Ihrem Kopierbefehl nicht verwenden möchten . Es wird alles, was Sie tun, rückgängig machen, um die SVN-Verzeichnisse zu vermeiden.Ich nehme an, es hängt davon ab, wie groß Ihr Baum ist, aber warum nicht erst alles kopieren und dann die .svn-Ordner zuschneiden?
?
quelle
find
, den richtigen Befehl zu erstellen , aber Sie tun dies nur einmal. Sie können den Befehl hunderte Male verwenden, sobald Sie es richtig verstanden haben.find
selbst besser benutzt, damit ich das nicht tun musste. Aber Sie haben Recht: An dieser Lösung ist nichts wirklich Falsches.Vergiss grep -v nicht
quelle
Sie können auch das Gegenteil tun. Kopieren Sie alles und löschen Sie die .svn-Ordner mit dem folgenden Befehl:
quelle