Wenn ich alle *.soDateien von srcnach kopieren dstmöchte, mache ich Folgendes:
cp src/*.so dst
Ich möchte jedoch alle *.soDateien von src und seinen Unterverzeichnissen in kopierendst . Irgendwelche Hinweise?
Wenn ich alle *.soDateien von srcnach kopieren dstmöchte, mache ich Folgendes:
cp src/*.so dst
Ich möchte jedoch alle *.soDateien von src und seinen Unterverzeichnissen in kopierendst . Irgendwelche Hinweise?
Antworten:
Versuchen:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepüberwiegen bei weitem die einfachen Shell-Patterns, die im -nameParameter verwendet werden find. xargsist auch weitaus leistungsfähiger als der -execParameter zu find.
Wenn Sie Bash verwenden, können Sie die globstar Shell-Option aktivieren , um Dateien und Verzeichnisse rekursiv abzugleichen:
shopt -s globstar
cp src/**/*.so dst
Wenn Sie Dateien suchen müssen, deren Namen mit .und / oder Dateien in und unter Verzeichnissen beginnen ., deren Namen mit beginnen , setzen Sie die dotglobOption ebenfalls (z shopt -s dotglob. B. mit ). Sie können beide in einem Befehl festlegen:
shopt -s globstar dotglob
Ich habe den von Mike vorgeschlagenen Befehl ausprobiert:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
Es endete jedoch damit, dass alle Dateien in einem Verzeichnis abgelegt wurden dstund ihre relativen Pfade verloren gingen.
Um die relativen Pfade beizubehalten, muss der Befehl folgendermaßen geändert werden:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst. Falls dies nicht der Fall ist, verwenden Sie cp --parents. Stellen Sie außerdem sicher, dass Sie die Dateinamen angeben. Also: ... | xargs -i cp --parents "{}" dst(Beachten Sie, dass das letzte Argument cp"nur" das Zielverzeichnis ist). Der Befehl kann mit dem -tFlag: noch kürzer (und wahrscheinlich auch schneller) gemacht werden ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsist nicht verfügbar. Ich habe dittoan seiner Stelle verwendet: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Ein anderer Weg dies zu tun ist wie folgt:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cpProzesse: ... -exec cp -t dst/ {} +.
-execmit ;, {}wird durch einen Pfad zu einem Zeitpunkt ersetzt. Sie erhalten cpfür jede Datei eine eigene . Mit +Syntax findErsetzt {}mit mehreren Ergebnissen (bis zu einer systemdefinierte Grenze der Befehlszeilenlänge; Einschränkung: {}muß das letzte , was vor +, damit cp -t). Das Erstellen und Beenden eines Prozesses ist relativ kostspielig. Aus diesem Grund ist es gut zu verwenden, +wenn Sie viele Ergebnisse erwarten. In diesem Fall kann das Kopieren vieler Dateien ohnehin viel Zeit in Anspruch nehmen, sodass der Unterschied unbemerkt bleibt. Trotzdem ist es eine gute Übung.
Das grep kann mit find's -name ersetzt werden :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
findKann Pattern Matching durchführen und Befehle ausführen. Die Ausgabe muss nicht weitergeleitet werden:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'