Apakah mungkin menyalin satu file ke beberapa direktori menggunakan perintah cp?
Saya mencoba yang berikut, yang tidak berhasil:
cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}
Saya tahu ini mungkin menggunakan for for, atau temukan. Tetapi apakah mungkin menggunakan perintah gnu cp?
Anda tidak dapat melakukan ini
cp
sendirian, tetapi Anda dapat menggabungkancp
denganxargs
:Akan menyalin
file1
untukdir1
,dir2
, dandir3
.xargs
akan meneleponcp
3 kali untuk melakukan ini, lihat halaman manualxargs
untuk detailnya.sumber
cp
sendirian" Hanya karena jawabannya berusaha membantu dengan menyarankan cara lain tidak berarti pertanyaannya tidak dijawab.echo dir[1-3] | xargs -n 1 cp filename
).Wildcard juga berfungsi dengan kode Roberts
sumber
Sejauh yang saya bisa melihatnya, Anda dapat menggunakan yang berikut:
The
-i
pilihancp
berarti perintah yang Anda akan ditanya apakah akan menimpa file dalam direktori saat ini denganfile.dat
. Meskipun ini bukan solusi yang sepenuhnya otomatis, ini berhasil untuk saya.sumber
-i
penjaga, bukankah itu akan meminta Anda untuk menulis setiap file? daripada menyalin ke direktori?cp: overwrite
pertanyaan, tetapi saya tidak harus menjawabnya, dan itu tidak menimpa file.Saya akan menggunakan
cat
dantee
berdasarkan jawaban yang saya lihat di /superuser/32630/parallel-file-copy-from-single-source-to-multiple-targets alih-alihcp
.Sebagai contoh:
sumber
cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
tee < inputfile outfile1 outfile2 > /dev/null
juga merupakan pola yang bermanfaat seperti yang ditunjukkan oleh jawaban Taywee. Perhatikan penggunaan io-redirection dengan '<' sehingga pemipaan dari kucing tidak diperlukan.Semua jawaban ini tampaknya lebih rumit daripada yang sudah jelas:
sumber
for d in */ ; do cp $file "$i" done
ls -db di*/subdir | xargs -n 1 cp File
-b
dalam kasus ada spasi dalam nama direktori jika tidak maka akan rusak sebagai item yang berbeda oleh xargs, punya masalah dengan versi gemasumber
Tidak menggunakan cp per se, tapi ...
Ini muncul bagi saya dalam konteks menyalin banyak rekaman GoPro dari kartu SD (lambat) ke tiga (lambat) drive USB. Saya ingin membaca data hanya sekali, karena butuh selamanya. Dan saya ingin itu bersifat rekursif.
(Dan Anda dapat menambahkan lebih banyak bagian> () tersebut jika Anda menginginkan lebih banyak keluaran.)
Saya belum membandingkannya, tapi pasti jauh lebih cepat daripada cp-in-a-loop (atau banyak permintaan paralel cp).
sumber
Untuk menggunakan menyalin dengan
xargs
ke direktori menggunakan wildcard pada Mac OS, satu-satunya solusi yang bekerja untuk saya dengan spasi dalam nama direktori adalah:Di mana
test
file untuk menyalinDan
./fs*/*
direktori untuk menyalinMasalahnya adalah bahwa xargs melihat spasi sebagai argumen baru, solusi untuk mengubah karakter pembatas menggunakan
-d
atau-E
sayangnya tidak berfungsi dengan baik pada Mac OS.sumber
Jika Anda ingin melakukannya tanpa perintah bercabang:
tee <inputfile file2 file3 file4 ... >/dev/null
sumber
Pada dasarnya setara dengan jawaban xargs, tetapi jika Anda ingin eksekusi paralel:
Jadi, misalnya, untuk menyalin file1 ke semua subdirektori folder saat ini (termasuk rekursi):
NB: Ini mungkin hanya menyampaikan kenaikan kecepatan yang terlihat untuk kasus penggunaan yang sangat spesifik, misalnya jika setiap direktori target adalah disk yang berbeda.
Secara fungsional juga mirip dengan argumen '-P' untuk xargs.
sumber
Tidak Anda tidak bisa.
Saya telah menemukan beberapa kali bahwa saya dapat menggunakan fungsi ini sehingga saya membuat alat sendiri untuk melakukan ini untuk saya.
http://github.com/ddavison/branch
cukup mudah -
branch myfile dir1 dir2 dir3
sumber
/e
misalnya, hanya sekali pada setiap mesin, maka saya bisa menulis powertools saya sendiri dan menyimpannya selamanya.sumber
Misalkan Anda ingin menyalin
fileName.txt
ke semua sub-direktori dalam direktori kerja ini.Dapatkan semua nama sub-direktori melalui
ls
dan simpan ke beberapa file sementara mengatakan,allFolders.txt
Cetak daftar dan berikan kepada perintah
xargs
.sumber
Cara lain adalah dengan menggunakan cat dan tee sebagai berikut:
Saya pikir ini akan sangat tidak efisien, karena pekerjaan akan dibagi di antara beberapa proses (satu per tujuan) dan hard drive akan menulis beberapa file sekaligus di berbagai bagian platter. Namun jika Anda ingin menulis file ke beberapa drive yang berbeda, metode ini mungkin akan sangat efisien (karena semua salinan dapat terjadi secara bersamaan).
sumber
Menggunakan skrip bash
sumber
jika Anda ingin menyalin beberapa folder ke beberapa folder, seseorang dapat melakukan sesuatu seperti ini:
echo dir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1, subdir2, subdir3}
sumber
Jika semua direktori target Anda cocok dengan ekspresi jalur - seperti mereka semua adalah subdirektori dari
path/to
- maka gunakanfind
kombinasi dengancp
seperti ini:Itu dia.
sumber
find
utas.Jika Anda harus spesifik pada folder mana untuk menyalin file, Anda dapat menggabungkan find dengan satu atau lebih greps. Misalnya untuk mengganti kejadian favicon.ico di subfolder apa pun yang dapat Anda gunakan:
sumber
Ini akan menyalin ke sub-direktori langsung, jika Anda ingin masuk lebih dalam, sesuaikan
-maxdepth
parameternya.Jika Anda tidak ingin menyalin ke semua direktori, semoga Anda dapat memfilter direktori yang tidak Anda sukai. Contoh menyalin ke semua folder dimulai dengan
a
Jika menyalin ke direktori direktori yang sewenang-wenang / terpisah, Anda memerlukan saran Robert Gamble.
sumber
Saya suka menyalin file ke beberapa direktori seperti itu:
cp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/
Dan menyalin direktori ke direktori lain:cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/
Saya tahu ini seperti mengeluarkan beberapa perintah, tetapi bekerja dengan baik ketika saya ingin mengetikkan 1 baris dan berjalan pergi untuk sementara waktu.
sumber
Misalnya jika Anda berada di direktori induk folder tujuan Anda, Anda dapat melakukannya:
untuk saya dalam $ (ls); lakukan cp sourcefile $ i; selesai
sumber
ls
, dan selalu mengutip variabel.for i in ./*; do cp sourcefile "$i"; done