Salinan File Rekursif, Non-Timpa?

21

Saya memiliki direktori yang berisi banyak folder lain yang berisi file CoffeeScript / JavaScript. Saya dapat mengkompilasi file CoffeeScript ke folder baru dengan struktur folder yang sama baik-baik saja.

Yang ingin saya lakukan adalah menyalin semua file * .js di folder sumber ke folder tujuan secara rekursif. Saya juga tidak ingin menimpa file yang sudah ada di folder tujuan. Adakah pemikiran bagaimana mencapai ini?

Saya mencoba menggunakan cp -n source/**.js desination/dan cp -Rn source/**.js desination/setelah melihat pertanyaan serupa lainnya, tetapi sepertinya tidak berhasil.

Adakah yang tahu bagaimana mencapainya?

AlbertEngelB
sumber
Apakah Anda sudah melihat rsync?
bonob
@bonob, saya belum. Saya pernah menggunakannya sekali atau dua kali, tetapi hanya untuk mendapatkan file dari jarak jauh.
AlbertEngelB

Jawaban:

25

Anda dapat menggunakan rsync (juga menyalin lokal)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r untuk berulang ke direktori,
  • --ignore-existing untuk mengabaikan file yang ada di tujuan,
  • yang includedan excludefilter berarti: mencakup semua direktori, mencakup semua * js file, termasuk sisanya; diperlukan menyertakan pertama, jika tidak, pengecualian akhir juga akan mengecualikan direktori sebelum isinya dipindai.

Terakhir, Anda dapat menambahkan -Pjika Anda ingin melihat kemajuan, --list-onlyjika Anda ingin melihat apa yang akan disalin tanpa benar-benar menyalin, dan -tjika Anda ingin mempertahankan cap waktu.


Ini tidak terkait, tetapi saya baru saja mempelajari perintah rsync, ketika saya memindahkan 15 tahun dokumen dari satu partisi ke partisi lain. Merasa yakin bahwa file-file saya ada di sana, saya kemudian menghapus partisi lama dan menaruh beberapa barang lain di sana; Saya kemudian menyadari bahwa saya kehilangan semua cap waktu, dan menemukan bendera -t. Hanya ingin berbagi kesusahan saya: '(

bonob
sumber
Haha, ini berhasil! rsyncrupanya adalah bomnya.
AlbertEngelB
3
Ya, saya hampir tidak tahu, tetapi baru belajar banyak tentang hal itu dengan mencoba menjawab pertanyaan Anda. Jika Anda perlu melangkah lebih jauh di masa depan, Anda dapat menentukan filter kompleks dalam file dan memanggilnya dalam perintah misalnya. Anda juga dapat memiliki filter per-direktori, kompres data saat menyalin, dan itu hanya menggores permukaannya!
bonob
7

Ini juga dapat dicapai menggunakan cp. Lihat disini:

sudo cp -vnpr /xxx/* /yyy

xxx = sumber

yyy = tujuan

v = verbose

n = tidak ada clobber (tidak ada overwrite)

p = pertahankan izin

r = rekursif

SEMbyotik
sumber
5

Melihat halaman manual sepertinya Anda menginginkan -nopsi.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
tantalum
sumber
Saya sudah mencoba menggunakan -n, namun itu tidak memungkinkan saya untuk memfilter menurut file *.
AlbertEngelB
0

Distro saya tidak memiliki clobber yang tersedia, jadi:

echo n | cp -vipr xxx yyy

xxx = sumber

yyy = tujuan

v = verbose

i = interaktif (diminta untuk menimpa) | itulah sebabnya perintah diawali dengan "echo n |"

p = pertahankan izin

r = rekursif

Oktavianus
sumber