Wie kopiere ich eine Datei über die Befehlszeile in mehrere Ordner?

67

Ich habe versucht, eine Datei test.txtmit einem Befehl in mehrere Verzeichnisse zu kopieren :

cp ~/test.txt ~/folder1 ~/folder2

Aber ich habe es nicht geschafft. Gibt es eine Möglichkeit, dies mit einem Befehl zu tun, damit ich eine Datei oder sogar einen Ordner in mehrere Verzeichnisse kopieren kann?

nux
quelle
Nicht einfach. Möglicherweise möchten Sie in "rsync" nachsehen, um mehrere vorhandene Kopien eines Ordners effizient zu aktualisieren
Thorbjørn Ravn Andersen
3
Versuchen Sie, ein bisschen Bash-Skript zu lernen. Es kann sehr nützlich werden:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz
Kein einziger Befehl, könnte aber nur einigen Leuten helfen, die hier stolpern:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Manu Järvinen
Duplikat von stackoverflow.com/a/195972/2097284 .
Camille Goudeseune

Antworten:

71

cpkann aus mehreren Quellen, aber nicht an mehrere Ziele kopieren. Siehe man cpfür weitere Informationen.

Der einzige Bash-Befehl, den ich kenne, der in mehrere Ziele kopieren / speichern kann, ist tee.

Sie können es in Ihrem Fall wie folgt verwenden:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

Beachten Sie, dass teedie Eingabe auch in die Standardausgabe (stdout) geschrieben wird. Wenn Sie dies nicht möchten, können Sie dies verhindern, indem Sie die Standardausgabe folgendermaßen umleiten /dev/null:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
Radu Rădeanu
quelle
10
Clever, das ist Betrug! :)
terdon
5
+1, klug! Und wenn Sie die >/dev/nullWerke auch mit Binärdateien verwenden, ohne das Terminal zu
vermasseln
1
+1 für Sie, Ihr immer ma Mann :), aber was ist, wenn ich ein Verzeichnis kopieren möchte?
Nux
2
@nux Vergessen Sie nicht, die -rOption cpfür Verzeichnisse zu verwenden
Radu Rădeanu
4
@nux: Im teeGegensatz zu cpKopien wird nur der Inhalt der Datei ignoriert, wobei Modus, Eigentümer und Zeitstempel ignoriert werden. So vermeiden Sie, den Dateinamen zu wiederholen:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs
61

Eine andere Möglichkeit, eine Kopie an mehrere Speicherorte zu erstellen, ist der folgende Befehl:

find dir1 dir2 -exec cp file.txt {} \;

Wenn dir1 oder dir2 Unterverzeichnisse haben, in die die Datei nicht kopiert werden soll, fügen Sie die folgende -maxdepth 0Option hinzu:

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

Beachten Sie, dass dies jede Datei in dir1und dir2mit file.txtdem Inhalt überschreibt , zusätzlich zum Kopieren. Wenn Sie nur kopieren file.txtmöchten, ohne andere Dateien in diesen Verzeichnissen zu beeinträchtigen, müssen Sie festlegen find, dass nur Verzeichnisse bearbeitet werden sollen:

find dir1 dir2 -type d -exec cp file.txt {} \;
Sylvain Pineau
quelle
4
Schöne lösung! Scheint mir perfekter als mit Abschlag.
Danatela
1
In der Tat ist keine Umleitung beteiligt und es ist immer noch ein Befehl.
Sylvain Pineau
2
@ SylvainPineau In der Tat gibt es 3: eins ist findund zweimal (in diesem Fall) cp. Um nicht zu sagen, das findbraucht viel Zeit.
Radu Rădeanu
3
Wenn die Definition eines "Befehls" ein "exec" -Aufruf ist, ist dies in meinem Buch möglicherweise "ein Befehl".
Kojiro
2
Ich komme immer wieder auf dieses Thema zurück, also dachte ich, ich sollte eine Gegenstimme abgeben: D
Jonathan
31

Der Befehl

cp ~/test.txt ~/folder1 ~/folder2

versucht, zwei Dateien ( ~/test.txtund ~/folder1) zum Ziel zu kopieren folder2. (Und wenn ~/folder2es ein Verzeichnis gibt und es sich um ein Verzeichnis handelt, wird eine Warnung angezeigt, dass das Verzeichnis weggelassen wird.)

Wenn Sie mehrere Kopien der Datei erstellen möchten test.txt, müssen Sie eine Schleife oder mehrere Befehle verwenden ...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(... und seien Sie vorsichtig, wenn Sie Leerzeichen in den Dateinamen eingebettet haben, müssen Sie Anführungszeichen setzen).

Um ganze Verzeichnisse zu kopieren, müssen Sie die -rOption verwenden:

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

Dies wird erstellt ~/folder1/folder3und ~/folder2/folder3mit allen Dateien enthalten.

Rmano
quelle
1
Für den vorbeigehenden Leser: Gemäß der Spezifikation ist eine for-Schleife ein zusammengesetzter Befehl. Daher ist dies immer noch ein Befehl und erfüllt alle Anforderungen für die Frage.
Kojiro
@nux, ich bin mit den Korrekturen nicht einverstanden. 1) die zwei Hauptstädte sind falsch, meine Absicht war es, die Befehle in die Phrase zu verschachteln. 2) die Ellipse ist eine Frage des Stils; Bitte lassen Sie meinen Stil in.
Rmano
1
Ok, tut mir leid Mann, ich dachte es wird besser aussehen.
Nux
auf meinem System speichert es Ordner3 nicht als ~ / Ordner1 / Ordner3, sondern kopiert alles in Ordner3 in Ordner1
alpha_989
23

Sie können ein Hilfeskript erstellen oder es mit xargseiner Druckfunktion ausführen (in diesem Fall echo):

echo firstDir secondDir | xargs -n 1 cp test

Dadurch wird jedes Verzeichnis als Argument für die cpFunktion angegeben, wobei die Testdatei als Parameter verwendet wird.

Evandro Silva
quelle
Dies ist wahrscheinlich die beste / direkteste Antwort auf die Frage
Bryson S.
7

Nach langer Suche wirkt diese Arbeit auch wie ein Zauber!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

Dadurch wird file.txt in jedes Verzeichnis an Ihrem aktuellen Standort im Terminal kopiert .

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

Dadurch wird ein Ordner in jedes Unterverzeichnis an Ihrem aktuellen Standort im Terminal kopiert.

Ich teile es, hoffe es hilft auch anderen.

nux
quelle
In zshkönnen Sie for i in *(/); ...alle Unterverzeichnisse [ -d ...durchlaufen, um den Test zu vermeiden . Erweiterte Globbing ist einer der Gründe, warum ich es über mag bash.
Rmano
können Sie den Code noch einmal in einem Kommando
korrigieren
1
In zshkann der erste Befehl dieser Antwort so vereinfacht werden for dir in *(/); do cp /path/file.txt "$dir"; done. Siehe zsh.sourceforge.net/Intro/intro_2.html
Rmano
5
Sie können den Test in jeder von Bourne abgeleiteten Shell mitfor dir in */;
Henk Langeveld,
@nux Das funktioniert sehr gut und der Befehl ist sehr einfach zu befolgen. Es sollte viel höher gewählt werden!
Nukeguy
1

Wenn Sie die Datei test.txt in jedes Verzeichnis in / tmp / target / ... kopieren möchten

Erstellen Sie eine Testumgebung:

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

Kopiere es:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
matt
quelle
0

Ich dachte nur, um eine Variation der Antwort von zu geben Sylvain Pineau

wo dir1und dir2sind nicht in Ihrem aktuellen Verzeichnis.

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

Hier sucht find dir1zwei Ebenen tief oder Sie können -maxdepthParameter weglassen, um dir1in allen Ordnern im aktuellen Verzeichnis und darunter zu suchen .

Joshi
quelle