Untuk file tunggal yang dapat Anda gunakan tee
untuk menyalin ke beberapa tempat:
cat <inputfile> | tee <outfile1> <outfile2> > <outfile3>
atau jika Anda lebih suka versi demoggified:
tee <outfile1> <outfile2> > <outfile3> < <inputfile>
Perhatikan bahwa seperti yang ditunjukkan oleh Dennis dalam tee
output komentar ke stdout
serta file yang terdaftar, maka gunakan redirect untuk menunjuk ke file 3 dalam contoh di atas. Anda juga dapat mengarahkan ini ke /dev/null
seperti di bawah ini - ini memiliki keuntungan menjaga agar daftar file lebih konsisten pada baris perintah (yang mungkin membuatnya lebih mudah untuk menyusun solusi untuk jumlah variabel file) tetapi sedikit kurang efisien (meskipun perbedaan efisiensi kecil: hampir sama dengan perbedaan antara menggunakan cat
versi atau versi tanpa cat
):
cat <inputfile> | tee <outfile1> <outfile2> <outfile3> > /dev/null
Anda mungkin dapat menggabungkan salah satu di atas dengan find
cukup mudah untuk beroperasi pada banyak file dalam satu direktori dan kurang mudah untuk beroperasi pada file yang tersebar di suatu struktur direktori. Kalau tidak, Anda mungkin hanya perlu mengatur beberapa operasi penyalinan secara paralel sebagai tugas terpisah dan berharap bahwa cache disk OS cerah dan / atau cukup besar sehingga masing-masing tugas paralel yang digunakan cache membaca data dari yang pertama alih-alih menyebabkan drive-head labrakan.
KETERSEDIAAN: tee
biasanya tersedia pada pengaturan Linux standar dan sistem unix atau tidak serupa lainnya, biasanya sebagai bagian dari paket "coreutils" GNU. Jika Anda menggunakan Windows (pertanyaan Anda tidak menentukan) maka Anda harus menemukannya di berbagai port Windows seperti Cygwin.
INFORMASI KEMAJUAN: Karena menyalin file besar dari media optik mungkin memerlukan waktu (atau melalui jaringan lambat, atau file yang lebih besar dari media cepat lokal), informasi kemajuan dapat berguna. Pada baris perintah saya cenderung menggunakan penampil pipa (tersedia di sebagian besar distro Linux & banyak koleksi port Windows dan mudah untuk mengkompilasi sendiri di mana tidak tersedia secara langsung) untuk ini - cukup ganti cat
dengan pv
seperti:
pv <inputfile> | tee <outfile1> <outfile2> > <outfile3>
tee
juga akan ditampilkan ke stdout, jadi Anda mungkin ingin melakukannyatee outputfile1 outputfile2 < inputfile > /dev/null
karena mengeluarkan file biner ke terminal bisa berisik dan mengacaukan pengaturannya.tar cf - file1 file2 | tee >(tar xf - -C ouput1) | tar xf - -C output2
Untuk Windows:
n2ncopy akan melakukan ini:
Untuk Linux:
The
cp
perintah sendiri dapat menyalin dari berbagai sumber tapi sayangnya tidak banyak tujuan. Anda harus menjalankannya beberapa kali dalam satu lingkaran. Anda dapat menggunakan loop seperti itu dan menempatkan semua nama direktori dalam file:atau gunakan xargs:
Kedua hal ini akan memungkinkan Anda untuk menyalin seluruh direktori / banyak file. Hal ini juga dibahas dalam ini artikel StackOverflow.
sumber
Didasarkan pada jawaban yang diberikan untuk pertanyaan serupa Cara lain adalah dengan menggunakan GNU Parallel untuk menjalankan beberapa
cp
instance sekaligus:Perintah di atas akan menyalin file1 ke ketiga folder tujuan secara paralel
sumber
Di bash (Linux, Mac atau Cygwin):
(tee menyalin inputnya ke STDOUT, jadi gunakan pengalihan pada target terakhir).
Di Windows, Cygwin sering berlebihan. Sebagai gantinya, Anda bisa menambahkan ongkos dari proyek UnxUtils , yang mencakup cat, tee, dan banyak lainnya.
sumber
Solusi Ryan Thompson:
masuk akal: Jika kecepatan tulis dir tujuan kurang lebih sama maka srcfile hanya akan dibaca sekali dari disk. Sisa waktu itu akan dibaca dari cache.
Saya akan membuatnya sedikit lebih umum, sehingga Anda juga mendapatkan subdirs:
Jika kecepatan tulis dari direktori dir sangat berbeda (misalnya satu di ram disk dan yang lain di NFS), maka Anda dapat melihat bahwa bagian-bagian srcdir membaca saat menyalin srcdir ke dest1 tidak lagi dalam cache disk saat menulis dest2.
sumber
Menurut jawaban ini: https://superuser.com/a/1064516/702806
Solusi yang lebih baik adalah menggunakan
tar
dantee
. Perintahnya lebih rumit tetapitar
tampaknya sangat kuat untuk ditransfer DAN perlu membaca sumbernya sekali saja.tar -c /source/dirA/ /source/file1 | tee >(cd /foo/destination3/; tar -x) >(cd /bar/destination2/; tar -x) >(cd /foobar/destination1/; tar -x) > /dev/null
Untuk menggunakannya dalam skrip, Anda mungkin perlu meluncurkan skrip Anda
bash -x script.sh
sumber
tar
adalah menambahkannya secara otomatis akan menyalin (mempertahankan) atribut file (misalnya, tanggal modifikasi / waktu, mode (perlindungan) dan berpotensi ACL, pemilik / grup (jika diistimewakan), SELinux konteks (jika berlaku), atribut diperluas (jika berlaku), dll.) ... ... ... ... ... ... ... PS Mengapa pengguna harus menggunakanbash -x
?#!/bin/sh
di awal skrip saya tetapi sintaks dari perintah tidak diterima. Anda dapat menggunakanbash -x
atau#!/bin/bash
di awal file Anda. Saya tidak tahu mengapa ada perbedaan antarash
danbash
interpretasi.Dalam bash:
sumber