Ist es möglich, eine einzelne Datei mit dem Befehl cp in mehrere Verzeichnisse zu kopieren?
Ich habe folgendes versucht, was nicht funktioniert hat:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Ich weiß, dass es möglich ist, eine for-Schleife zu verwenden oder zu finden. Aber ist es möglich, den Befehl gnu cp zu verwenden?
Sie können dies nicht
cp
alleine tun, aber Sie können kombinierencp
mitxargs
:Kopiert
file1
zudir1
,dir2
unddir3
.xargs
Ich werdecp
3 Mal anrufen , um dies zu tun. Weiterexargs
Informationen finden Sie in der Manpage .quelle
cp
alleine tun " Nur weil die Antwort versucht hat, hilfreich zu sein, indem sie einen anderen Weg vorschlägt, heißt das nicht, dass die Frage nicht beantwortet wurde.echo dir[1-3] | xargs -n 1 cp filename
. B. ).Platzhalter funktionieren auch mit Roberts-Code
quelle
Soweit ich es sehen kann, können Sie Folgendes verwenden:
Die
-i
Befehlsoptioncp
bedeutet, dass Sie gefragt werden, ob Sie eine Datei im aktuellen Verzeichnis mit dem überschreiben möchtenfile.dat
. Obwohl es keine vollautomatische Lösung ist, hat es für mich geklappt.quelle
-i
Guard hinzugefügt zu haben , aber fordert Sie das nicht dazu auf, jede Datei zu überschreiben? anstatt in die Verzeichnisse zu kopieren?cp: overwrite
Fragen gedruckt , aber ich musste keine beantworten, und die Dateien wurden nicht überschrieben.Ich würde
cat
undtee
basierend auf den Antworten, die ich unter /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets gesehen habe, anstelle voncp
.Beispielsweise:
quelle
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
ist auch ein nützliches Muster, wie Taywees Antwort zeigt. Beachten Sie die Verwendung der Io-Umleitung mit '<', damit keine Rohrleitungen von cat benötigt werden.Diese Antworten scheinen alle komplizierter als das Offensichtliche:
quelle
for d in */ ; do cp $file "$i" done
ls -db di*/subdir | xargs -n 1 cp File
-b
Falls der Verzeichnisname ein Leerzeichen enthält , wird er von xargs als anderes Element beschädigt. Hatte dieses Problem mit der Echo-Versionquelle
Nicht mit cp per se, aber ...
Dies kam für mich im Zusammenhang mit dem Kopieren vieler Gopro-Aufnahmen von einer (langsamen) SD-Karte auf drei (langsame) USB-Laufwerke. Ich wollte die Daten nur einmal lesen, weil es ewig gedauert hat. Und ich wollte es rekursiv.
(Und Sie können weitere dieser> () Abschnitte hinzufügen, wenn Sie mehr Ausgaben wünschen.)
Ich habe das nicht bewertet, aber es ist definitiv viel schneller als cp-in-a-loop (oder eine Reihe paralleler cp-Aufrufe).
quelle
Für das Kopieren
xargs
in Verzeichnisse mit Platzhaltern unter Mac OS ist die einzige Lösung, die für mich mit Leerzeichen im Verzeichnisnamen funktioniert hat, folgende:Wo
test
ist die Datei zu kopierenund
./fs*/*
Verzeichnisse zu kopierenDas Problem ist, dass xargs Leerzeichen als neues Argument ansieht, die Lösungen zum Ändern des Trennzeichens unter Verwendung von
-d
oder unter-E
Mac OS leider nicht richtig funktioniert.quelle
Wenn Sie dies ohne einen gegabelten Befehl tun möchten:
tee <inputfile file2 file3 file4 ... >/dev/null
quelle
Entspricht im Wesentlichen der Antwort von xargs, aber falls Sie eine parallele Ausführung wünschen:
So kopieren Sie beispielsweise Datei1 in alle Unterverzeichnisse des aktuellen Ordners (einschließlich Rekursion):
NB: Dies führt wahrscheinlich nur zu spürbaren Geschwindigkeitsgewinnen für ganz bestimmte Anwendungsfälle, z. B. wenn jedes Zielverzeichnis eine eigene Festplatte ist.
Es ähnelt auch funktional dem Argument '-P' für xargs.
quelle
Nein, du kannst nicht.
Ich habe mehrfach festgestellt, dass ich diese Funktionalität nutzen kann, also habe ich mein eigenes Tool erstellt, um dies für mich zu tun.
http://github.com/ddavison/branch
ziemlich einfach -
branch myfile dir1 dir2 dir3
quelle
/e
beispielsweise nur einmal auf jedem Computer zu mounten , könnte ich meine eigenen Powertools schreiben und sie für immer behalten.quelle
Angenommen, Sie möchten in
fileName.txt
alle Unterverzeichnisse im aktuellen Arbeitsverzeichnis kopieren .Holen Sie sich alle Namen der Unterverzeichnisse durch
ls
und speichern Sie sie in einer temporären Datei.allFolders.txt
Drucken Sie die Liste aus und übergeben Sie sie an den Befehl
xargs
.quelle
Eine andere Möglichkeit besteht darin, Katze und Tee wie folgt zu verwenden:
Ich denke, dies wäre jedoch ziemlich ineffizient, da der Job auf mehrere Prozesse aufgeteilt würde (einer pro Ziel) und die Festplatte mehrere Dateien gleichzeitig über verschiedene Teile des Plattentellers schreiben würde. Wenn Sie jedoch eine Datei auf mehrere verschiedene Laufwerke schreiben möchten, ist diese Methode wahrscheinlich ziemlich effizient (da alle Kopien gleichzeitig ausgeführt werden können).
quelle
Verwenden eines Bash-Skripts
quelle
Wenn Sie mehrere Ordner in mehrere Ordner kopieren möchten, können Sie Folgendes tun:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}
quelle
Wenn alle Ihre Zielverzeichnisse mit einem Pfadausdruck übereinstimmen - wie sie alle Unterverzeichnisse von
path/to
-, verwenden Sie sie einfachfind
in Kombination mit folgendemcp
:Das ist es.
quelle
find
in thread verwendet wurde, abgelehnt.Wenn Sie genau angeben möchten, in welche Ordner die Datei kopiert werden soll, können Sie find mit einem oder mehreren greps kombinieren. Zum Beispiel, um alle Vorkommen von favicon.ico in einem beliebigen Unterordner zu ersetzen, können Sie Folgendes verwenden:
quelle
Dadurch wird in die unmittelbaren Unterverzeichnisse kopiert. Wenn Sie tiefer gehen möchten, passen Sie den
-maxdepth
Parameter an.Wenn Sie nicht in alle Verzeichnisse kopieren möchten, können Sie hoffentlich die Verzeichnisse filtern, an denen Sie nicht interessiert sind. Beispiel für das Kopieren in alle Ordner, beginnend mit
a
Wenn Sie in einen beliebigen / nicht zusammenhängenden Satz von Verzeichnissen kopieren, benötigen Sie den Vorschlag von Robert Gamble.
quelle
Ich möchte eine Datei als solche in mehrere Verzeichnisse
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
kopieren : Und ein Verzeichnis in andere Verzeichnisse kopieren:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Ich weiß, dass es so ist, als würde man mehrere Befehle ausgeben, aber es funktioniert gut für mich, wenn ich eine Zeile eingeben und eine Weile weggehen möchte.
quelle
Wenn Sie sich beispielsweise im übergeordneten Verzeichnis Ihrer Zielordner befinden, können Sie Folgendes tun:
für i in $ (ls); do cp sourcefile $ i; getan
quelle
ls
, und zitieren Sie immer Variablen.for i in ./*; do cp sourcefile "$i"; done