Domanda Come copiare un file in più cartelle usando la riga di comando?


Ho provato a copiare un file test.txt a più directory con un comando:

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

Ma non ci sono riuscito. C'è un modo per farlo in un comando in modo da poter copiare un file o anche una cartella in più directory?


59
2018-03-11 16:11


origine


Non facilmente. Si consiglia di esaminare "rsync" per aggiornare in modo efficiente più copie esistenti di una cartella - Thorbjørn Ravn Andersen
Prova ad imparare un po 'di bash-script. Può diventare molto utile: for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done - Shahbaz
Non un singolo comando, ma potrebbe solo aiutare alcune persone che inciampano qui: cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2 - Manu Järvinen
Duplicato di stackoverflow.com/a/195972/2097284. - Camille Goudeseune


risposte:


cp può copiare da più fonti, ma non si può copia su più destinazioni. Vedere man cp per maggiori informazioni.

L'unico comando bash che conosco che può copiare / salvare su più destinazioni è tee.

Puoi usarlo nel tuo caso come segue:

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

Nota che tee scrive anche l'input sullo standard output (stdout). Quindi, se non lo vuoi, puoi prevenirlo reindirizzando l'output standard a /dev/null come segue:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

65
2018-03-11 17:01



Intelligente, questo è imbroglio! :) - terdon♦
+1, intelligente! E se usi il >/dev/null funziona anche con file binari, senza rovinare il terminale ... - Rmano
+1 per te, il tuo sempre ma uomo :), ma cosa succede se voglio copiare una directory? - nux
@nux Non dimenticare di usare -r opzione con cp in caso di directory - Radu Rădeanu
@nux: tee a differenza di cp copia solo il contenuto del file ignorandone modalità, proprietà, data e ora. Per evitare di ripetere il nome del file: f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f - jfs


Un altro modo per ottenere una copia in più posizioni è il seguente comando:

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

Se dir1 o dir2 hanno sottodirectory in cui non vuoi copiare il file, aggiungi -maxdepth 0opzione :

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

Si noti che questo sovrascriverà ogni file in dir1 e dir2 con file.txtI contenuti, oltre a copiarlo. Per copiare solo file.txt senza influenzare altri file in queste directory, dire find agire solo sulle directory:

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

54
2018-03-11 16:31



Bella soluzione! Mi sembra più perfetto che con il tee. - Danatela
In effetti, non è coinvolto alcun reindirizzamento ed è ancora un comando. - Sylvain Pineau
@SylvainPineau In realtà ci sono 3: uno è find e per due volte (in questo caso) cp. Non per dire quello find ho bisogno di molto tempo - Radu Rădeanu
Se la definizione di "comando" è una chiamata "exec", forse, ma questo è "un comando" nel mio libro. - kojiro
Continuo a tornare su questo, quindi ho pensato di darmi una risposta positiva: D - Jonathan


Il comando

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

prova a copiare due file (~/test.txt e ~/folder1) alla destinazione folder2. (E se ~/folder2 esiste ed è una directory si avrà un avviso "omettendo directory").

Se si desidera creare più copie del file test.txt, devi usare un loop o più comandi ...

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

(... e fai attenzione se hai spazi incorporati nei nomi dei file, avrai bisogno di quotazioni).

Per copiare intere directory devi usare il -r opzione:

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

questo creerà ~/folder1/folder3 e ~/folder2/folder3 con tutti i file inclusi.


30
2018-03-11 16:25



Per il lettore di passaggio: secondo il spec, un ciclo for è un comando composto. Quindi questo è ancora un comando e soddisfa tutti i requisiti per la domanda. - kojiro
@ Nux, non sono d'accordo sulle correzioni. 1) le due capitali sono sbagliate, il mio intento era di interleave i comandi nella frase. 2) l'ellissi è una questione di stile; per favore lascia il mio stile - Rmano
ok, mi dispiace amico, ho pensato che sembrerà migliore. - nux
sul mio sistema, non salva cartella3 come ~ / folder1 / folder3, ma piuttosto copia tutto in folder3 in folder1 - alpha_989


Puoi creare uno script di aiuto, o puoi farlo con xargs e una funzione di stampa (in questo caso, echo ):

echo firstDir secondDir | xargs -n 1 cp test

Questo renderà ogni directory come argomento per il cp funzione, usando test file come parametro.


23
2018-03-11 16:28



Questa è probabilmente la risposta migliore / più diretta alla domanda - Bryson S.


Dopo una lunga ricerca, anche questo lavoro come un fascino!

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

Questo copierà file.txt in ogni directory nella posizione corrente nel terminale.

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

Questo copierà una cartella in ogni sottodirectory nella tua posizione corrente nel terminale.

Lo condivido spero che aiuti anche gli altri.


6
2018-03-12 00:06



In zsh, Puoi usare for i in *(/); ... per scorrere su tutte le sottodirectory, in modo da poter evitare il [ -d ... test. Il globbing prolungato è uno dei motivi per cui mi piace bash. - Rmano
può a sua destra il codice di nuovo in un comando - nux
In zsh, il primo comando di questa risposta può essere semplificato come for dir in *(/); do cp /path/file.txt "$dir"; done. Vedere zsh.sourceforge.net/Intro/intro_2.html - Rmano
Puoi eliminare il test in qualsiasi shell derivata da Bourne con for dir in */; - Henk Langeveld
@nux Funziona molto bene e il comando è molto facile da seguire. Dovrebbe essere votato molto più in alto! - nukeguy


Se vuoi copiare il file test.txt in ogni directory in / tmp / target / ...

creare un ambiente di test:

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

copialo:

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

1
2018-06-29 14:26





Ho solo pensato di dare una variazione alla risposta di Sylvain Pineau 

dove dir1 e dir2 non sono nella tua directory attuale.

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

qui trovare cercherà dir1 due livelli in profondità o puoi lasciar perdere -maxdepth parametro da trovare dir1 in tutte le cartelle nella directory corrente e sotto di essa.


0
2017-10-07 18:42