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?
Versuchen:
find src/ -type f | grep -i 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/ ';'
grep
überwiegen bei weitem die einfachen Shell-Patterns, die im-name
Parameter verwendet werdenfind
.xargs
ist auch weitaus leistungsfähiger als der-exec
Parameter zufind
.Wenn Sie Bash verwenden, können Sie die
globstar
Shell-Option aktivieren , um Dateien und Verzeichnisse rekursiv abzugleichen:Wenn Sie Dateien suchen müssen, deren Namen mit
.
und / oder Dateien in und unter Verzeichnissen beginnen.
, deren Namen mit beginnen , setzen Sie diedotglob
Option ebenfalls (zshopt -s dotglob
. B. mit ). Sie können beide in einem Befehl festlegen:quelle
Ich habe den von Mike vorgeschlagenen Befehl ausprobiert:
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:
quelle
dst
. Falls dies nicht der Fall ist, verwenden Siecp --parents
. Stellen Sie außerdem sicher, dass Sie die Dateinamen angeben. Also:... | xargs -i cp --parents "{}" dst
(Beachten Sie, dass das letzte Argumentcp
"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 habeditto
an seiner Stelle verwendet: stackoverflow.com/questions/11246070/cp-parents-option-on-macEin anderer Weg dies zu tun ist wie folgt:
quelle
cp
Prozesse:... -exec cp -t dst/ {} +
.-exec
mit;
,{}
wird durch einen Pfad zu einem Zeitpunkt ersetzt. Sie erhaltencp
für jede Datei eine eigene . Mit+
Syntaxfind
Ersetzt{}
mit mehreren Ergebnissen (bis zu einer systemdefinierte Grenze der Befehlszeilenlänge; Einschränkung:{}
muß das letzte , was vor+
, damitcp -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 :
quelle