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


68

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

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

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


Non facilmente. Potresti voler esaminare "rsync" per aggiornare in modo efficiente più copie esistenti di una cartella
Thorbjørn Ravn Andersen

3
Prova ad imparare un po 'di bash-script. Può essere 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,

Risposte:


72

cppuò copiare da più fonti, ma non può copiare in più destinazioni. Vedi man cpper maggiori informazioni.

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

Puoi usarlo nel tuo caso come segue:

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

Si noti che teescrive anche l'input nell'output standard (stdout). Quindi, se non lo desideri, puoi impedirlo reindirizzando l'output standard /dev/nullcome segue:

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

10
Intelligente, questo è barare! :)
terdon

5
+1, intelligente! E se usi le >/dev/nullopere anche con file binari, senza
rovinare

1
+1 per te, sempre il tuo uomo :), ma cosa succede se voglio copiare una directory?
nux

2
@nux Non dimenticare di usare l' -ropzione con cpin caso di directory
Radu Rădeanu

4
@nux: teediversamente dalle cpcopie, solo il contenuto del file ignora la sua modalità, proprietà, timestamp. Per evitare di ripetere il nome del file:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs

61

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 si desidera copiare il file, aggiungere l' -maxdepth 0opzione:

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

Nota che questo sovrascriverà ogni file nel dir1e dir2con file.txtil suo contenuto, oltre a copiarlo. Per copiare solo file.txtsenza influire su altri file in queste directory, dire finddi agire solo sulle directory:

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

4
Bella soluzione! Mi sembra più perfetto che con il tee.
Danatela,

1
In effetti, non è coinvolto alcun reindirizzamento ed è ancora un comando.
Sylvain Pineau,

2
@SylvainPineau In effetti ce ne sono 3: uno è finde per due volte (in questo caso) cp. Per non dire che ha findbisogno di molto tempo.
Radu Rădeanu,

3
Se la definizione di "comando" è una chiamata "exec", forse, ma questo è "un comando" nel mio libro.
Kojiro,

2
Continuo a tornare a questo, quindi ho pensato di dare un voto: D
Jonathan

31

Il comando

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

prova a copiare due file ( ~/test.txte ~/folder1) nella destinazione folder2. (E se ~/folder2esiste ed è una directory avrai un avviso di "omissione della directory").

Se vuoi fare più copie del file test.txt, devi usare un ciclo 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 un preventivo).

Per copiare intere directory devi usare l' -ropzione:

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

questo creerà ~/folder1/folder3e ~/folder2/folder3con tutti i file inclusi.


1
Per il lettore di passaggio: secondo le specifiche , un ciclo for è un comando composto. Pertanto, 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 quello di intercalare i comandi nella frase. 2) i puntini di sospensione sono una questione di stile; per favore, lasciami entrare il mio stile.
Rmano,

1
ok, scusa amico, ho pensato che sarebbe stato meglio.
nux

sul mio sistema, non salva la cartella3 come ~ / cartella1 / cartella3, ma piuttosto copia tutto nella cartella3 nella cartella1
alpha_989

23

Puoi creare uno script di aiuto oppure puoi farlo con xargsuna funzione di stampa (in questo caso echo):

echo firstDir secondDir | xargs -n 1 cp test

Questo renderà ogni directory come argomento della cpfunzione, usando il file di test come parametro.


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

7

Dopo una lunga ricerca funziona anche 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.

Condivido la speranza che aiuti anche gli altri.


In zsh, puoi usare for i in *(/); ...per scorrere su tutte le sottodirectory, in modo da evitare il [ -d ...test. Il globbing prolungato è uno dei motivi per cui mi piace bash.
Rmano,

puoi di nuovo il tuo diritto in un comando
nux

1
In zsh, il primo comando di questa risposta può essere semplificato come for dir in *(/); do cp /path/file.txt "$dir"; done. Vedi zsh.sourceforge.net/Intro/intro_2.html
Rmano

5
Puoi eliminare il test in qualsiasi shell derivata da Bourne confor dir in */;
Henk Langeveld

@nux Funziona davvero bene e il comando è molto facile da seguire. Dovrebbe essere votato molto più in alto!
nukeguy,

1

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

copiarlo:

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

0

Ho pensato di dare una variazione alla risposta di Sylvain Pineau

dove dir1e dir2non sono nella directory corrente.

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

qui find cercherà dir1due livelli di profondità oppure puoi tralasciare i -maxdepthparametri per trovare dir1in tutte le cartelle nella directory corrente e sotto di essa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.