Wenn ich alle *.so
Dateien von src
nach kopieren dst
möchte, mache ich Folgendes:
cp src/*.so dst
Ich möchte jedoch alle *.so
Dateien von src und seinen Unterverzeichnissen in kopierendst
. Irgendwelche Hinweise?
Wenn ich alle *.so
Dateien von src
nach kopieren dst
möchte, mache ich Folgendes:
cp src/*.so dst
Ich möchte jedoch alle *.so
Dateien 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 -name
Parameter verwendet werden find
. xargs
ist auch weitaus leistungsfähiger als der -exec
Parameter 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 dotglob
Option 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 dst
und 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 -t
Flag: noch kürzer (und wahrscheinlich auch schneller) gemacht werden ... | xargs cp --parents -t dst
.
... | xargs cp {} --parents -t dst.
--parents
ist nicht verfügbar. Ich habe ditto
an 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/ \;
cp
Prozesse: ... -exec cp -t dst/ {} +
.
-exec
mit ;
, {}
wird durch einen Pfad zu einem Zeitpunkt ersetzt. Sie erhalten cp
für jede Datei eine eigene . Mit +
Syntax find
Ersetzt {}
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/{}
find
Kann Pattern Matching durchführen und Befehle ausführen. Die Ausgabe muss nicht weitergeleitet werden:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'