Bagaimana cara menyalin file ke beberapa folder menggunakan baris perintah?

67

Saya telah mencoba menyalin file test.txtke banyak direktori dengan satu perintah:

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

Tetapi saya tidak berhasil. Apakah ada cara untuk melakukan itu dalam satu perintah sehingga saya dapat menyalin file atau bahkan folder ke beberapa direktori?

nux
sumber
Tidak mudah. Anda mungkin ingin melihat ke "rsync" untuk memperbarui secara efisien beberapa salinan folder yang ada
Thorbjørn Ravn Andersen
3
Coba pelajari sedikit bash-script. Ini bisa menjadi sangat berguna:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz
Bukan satu perintah tetapi mungkin hanya membantu beberapa orang yang tersandung di sini:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
Manu Järvinen
Gandakan stackoverflow.com/a/195972/2097284 .
Camille Goudeseune

Jawaban:

71

cpdapat menyalin dari berbagai sumber, tetapi tidak dapat menyalin ke berbagai tujuan. Lihat man cpuntuk info lebih lanjut.

Satu-satunya perintah bash yang saya tahu yang dapat menyalin / menyimpan ke beberapa tujuan adalah tee.

Anda dapat menggunakannya dalam kasus Anda sebagai berikut:

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

Catatan yang teejuga menulis input ke output standar (stdout). Jadi, jika Anda tidak menginginkan ini, Anda dapat mencegahnya dengan mengarahkan ulang output standar /dev/nullsebagai berikut:

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null
Radu Rădeanu
sumber
10
Pintar, itu curang! :)
terdon
5
+1, pintar! Dan jika Anda menggunakan >/dev/nullkarya dengan file biner juga, tanpa mengacaukan terminal ...
Rmano
1
1 untuk Anda, Anda selalu pria :), tetapi bagaimana jika saya ingin menyalin direktori?
nux
2
@nux Jangan lupa untuk menggunakan -ropsi cpdalam hal direktori
Radu Rădeanu
4
@nux: teetidak seperti cpsalinan, hanya konten file yang mengabaikan modenya, kepemilikan, cap waktu. Untuk menghindari pengulangan nama file:f=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
jfs
61

Cara lain untuk mencapai salinan ke beberapa lokasi adalah perintah berikut:

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

Jika dir1 atau dir2 memiliki sub-direktori di mana Anda tidak ingin file tersebut disalin, tambahkan -maxdepth 0opsi:

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

Perhatikan bahwa ini akan menimpa setiap file di dalam dir1dan dir2dengan file.txtkonten, selain menyalinnya. Untuk hanya menyalin file.txttanpa mempengaruhi file lain di direktori ini, katakan finduntuk hanya bertindak pada direktori:

find dir1 dir2 -type d -exec cp file.txt {} \;
Sylvain Pineau
sumber
4
Solusi bagus! Menurut saya lebih sempurna daripada dengan tee.
Danatela
1
Memang, tidak ada pengalihan yang terlibat dan itu masih satu perintah.
Sylvain Pineau
2
@SylvainPineau Sebenarnya ada 3: satu finddan dua kali (dalam hal ini) cp. Bukan untuk mengatakan bahwa findbutuh banyak waktu.
Radu Rădeanu
3
Jika definisi "perintah" adalah panggilan "exec", mungkin, tetapi ini "satu perintah" dalam buku saya.
kojiro
2
Saya terus kembali ke yang ini, jadi saya pikir saya harus memberi suara positif: D
Jonathan
31

Perintah

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

mencoba menyalin dua file ( ~/test.txtdan ~/folder1) ke tujuan folder2. (Dan jika ~/folder2ada dan merupakan direktori Anda akan memiliki peringatan "menghilangkan direktori").

Jika Anda ingin membuat banyak salinan file test.txt, Anda harus menggunakan loop atau beberapa perintah ...

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

(... dan berhati-hatilah jika Anda memiliki ruang yang disematkan dalam nama file, Anda perlu mengutip).

Untuk menyalin seluruh direktori Anda harus menggunakan -ropsi:

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

ini akan membuat ~/folder1/folder3dan ~/folder2/folder3dengan semua file disertakan.

Rmano
sumber
1
Untuk pembaca yang lewat: Menurut spec , a for loop adalah perintah majemuk. Karena itu ini masih satu perintah, dan memenuhi semua persyaratan untuk pertanyaan.
kojiro
@ Neux, saya tidak setuju dengan koreksi. 1) dua ibukota salah, maksud saya adalah untuk menyisipkan perintah ke dalam frasa. 2) elipsis adalah masalah gaya; tolong biarkan gayaku.
Rmano
1
ok, maaf, saya pikir ini akan terlihat lebih baik.
nux
pada sistem saya, itu tidak menyimpan folder3 sebagai ~ / folder1 / folder3, melainkan menyalin semua yang ada di folder3 ke folder1
alpha_989
23

Anda dapat membuat skrip bantuan, atau Anda dapat melakukannya dengan xargsdan fungsi cetak (dalam hal ini, echo):

echo firstDir secondDir | xargs -n 1 cp test

Ini akan membuat setiap direktori sebagai argumen ke cpfungsi, menggunakan file uji sebagai parameter.

Evandro Silva
sumber
Ini mungkin jawaban terbaik / paling langsung untuk pertanyaan
Bryson S.
7

Setelah pencarian yang panjang karya ini seperti Mantra juga!

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

Ini akan menyalin file.txt ke setiap direktori di lokasi Anda saat ini di terminal.

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

Ini akan menyalin folder ke setiap sub direktori di lokasi Anda saat ini di terminal.

Saya membagikannya berharap ini membantu orang lain juga.

nux
sumber
Di zsh, Anda dapat menggunakan for i in *(/); ...untuk mengulang semua subdirektori, sehingga Anda dapat menghindari [ -d ...tes. Globbing yang diperpanjang adalah salah satu alasan saya menyukainya bash.
Rmano
dapatkah Anda kanan kode lagi dalam perintah
nux
1
Di zsh, perintah pertama dari jawaban ini dapat disederhanakan sebagai for dir in *(/); do cp /path/file.txt "$dir"; done. Lihat zsh.sourceforge.net/Intro/intro_2.html
Rmano
5
Anda dapat menghilangkan tes di shell Bourne yang diturunkan denganfor dir in */;
Henk Langeveld
@nux Ini berfungsi dengan sangat baik dan perintahnya sangat mudah diikuti. Itu harus dipilih jauh lebih tinggi!
nukeguy
1

Jika Anda ingin menyalin file test.txt di setiap direktori di / tmp / target / ...

buat lingkungan pengujian:

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

salin:

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

Hanya berpikir untuk memberikan variasi jawaban Sylvain Pineau

di mana dir1dan dir2tidak di direktori Anda saat ini.

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

di sini temukan akan mencari dir1dua level dalam atau Anda dapat meninggalkan -maxdepthparameter untuk menemukan dir1di semua folder di direktori saat ini dan di bawahnya.

Joshi
sumber