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

59

Ho provato a copiare un file test.txt in 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?

    
posta nux 11.03.2014 - 17:11

7 risposte

65

cp può copiare da più fonti, ma impossibile copiare su più destinazioni. Vedi 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

Si noti 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
    
risposta data Radu Rădeanu 11.03.2014 - 18:01
54

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 0 opzione:

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

Si noti che questo sovrascriverà ogni file in dir1 e dir2 con il contenuto di file.txt , oltre a copiarlo. Per copiare solo file.txt senza influire sugli altri file in queste directory, dire a find di agire solo sulle directory:

find dir1 dir2 -type d -exec cp file.txt {} \;
    
risposta data Sylvain Pineau 11.03.2014 - 17:31
30

Il comando

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

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

Se vuoi fare 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 l'opzione -r :

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

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

    
risposta data Rmano 11.03.2014 - 17:25
23

Puoi creare uno script di aiuto, oppure 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 alla funzione cp , usando come parametro il file test .

    
risposta data Evandro Silva 11.03.2014 - 17:28
6

Dopo una lunga ricerca, anche questo funziona come un incantesimo!

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

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

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

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

Lo condivido spero che aiuti anche gli altri.

    
risposta data nux 12.03.2014 - 01:06
1

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

crea un ambiente di test:

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

copia:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;
    
risposta data matt 29.06.2015 - 16:26
0

Ho pensato di dare una variazione alla risposta di Sylvain Pineau

dove dir1 e dir2 non si trovano nella directory corrente.

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

qui find cercherà dir1 deep di due livelli oppure puoi lasciare fuori -maxdepth parametro per trovare dir1 in tutte le cartelle nella directory corrente e sotto di esso.

    
risposta data Joshi 07.10.2017 - 20:42

Leggi altre domande sui tag