cp printah: nyalin folder file kanthi bener ing *nix

cp printah: nyalin folder file kanthi bener ing *nix

Artikel iki bakal mbukak sawetara bab non-jelas related kanggo nggunakake wildcards nalika nyalin, prilaku printah ambigu cp nalika nyalin, uga cara sing ngidini sampeyan nyalin file kanthi bener tanpa skip utawa nabrak.

Kita kudu nyalin kabeh saka folder / sumber menyang folder / target.

Bab pisanan sing ana ing pikiran yaiku:

cp /source/* /target

Ayo langsung mbenerake printah iki kanggo:

cp -a /source/* /target

Kunci -a bakal nambah nyalin kabeh atribut, hak lan nambah rekursi. Nalika reproduksi hak sing tepat ora dibutuhake, kunci cukup -r.

Sawise nyalin, kita bakal nemokake manawa ora kabeh file disalin - file diwiwiti kanthi titik kaya:

.profile
.local
.mc

lan liya-liyane.

Yagene iki kedadeyan?

Amarga wildcard diproses dening cangkang (bash ing kasus khas). Kanthi gawan, bash bakal nglirwakake kabeh file sing diwiwiti kanthi titik, amarga dianggep minangka didhelikake. Kanggo ngindhari prilaku iki kita kudu ngganti prilaku bash nggunakake printah:

shopt -s dotglob

Kanggo mesthekake yen owah-owahan prilaku iki tetep sawise urip maneh, sampeyan bisa nggawe file wildcard.sh karo printah iki ing folder. /etc/profile.d (Mungkin distribusi sampeyan duwe folder sing beda).

Lan yen ora ana file ing direktori sumber, cangkang ora bakal bisa ngganti apa wae ing panggonan tanda bintang, lan nyalin uga bakal gagal karo kesalahan. Ana pilihan kanggo kahanan iki failglob ΠΈ nullglob. Kita kudu nyetel failglob, sing bakal nyegah prentah supaya ora dieksekusi. nullglob ora bakal bisa, awit iku ngowahi senar karo wildcards sing ora nemokake match menyang senar kosong (nul dawa), kang kanggo cp bakal nyebabake kesalahan.

Nanging, yen ana ewonan file utawa luwih ing folder kasebut, pendekatan wildcards kudu ditinggalake kabeh. Kasunyatan iku bash ngembangake wildcards dadi baris printah sing dawa banget kaya:

cp -a /souce/a /source/b /source/c …… /target

Ana watesan ing dawa baris printah, kang bisa kita mangerteni nggunakake printah:

getconf ARG_MAX

Ayo entuk dawa maksimum baris printah ing bita:

2097152

Utawa:

xargs --show-limits

Kita entuk kaya:

….
Maximum length of command we could actually use: 2089314
….

Dadi, ayo nindakake tanpa wildcards kabeh.

Ayo nulis wae

cp -a /source /target

Lan ing kene kita ngadhepi ambiguitas prilaku cp. Yen folder / target ora ana, mula kita bakal entuk apa sing dibutuhake.

Nanging, yen folder target ana, banjur file bakal disalin menyang folder / target / sumber.

Kita ora bisa tansah mbusak folder / target luwih dhisik, amarga bisa ngemot file sing dibutuhake lan tujuane, contone, kanggo nambah file ing / target karo file saka / sumber.

Yen folder sumber lan tujuan padha, contone, kita nyalin saka / sumber menyang / ngarep / sumber, banjur kita bisa nggunakake printah:

cp -a /source /home

Lan sawise nyalin, file ing /home/source bakal ditambah karo file saka /source.

Iki minangka masalah logis: kita bisa nambah file ing direktori tujuan yen folder kasebut dijenengi padha, nanging yen beda, folder sumber bakal diselehake ing panggonan sing dituju. Kepiye cara nyalin file saka / sumber menyang / target nggunakake cp tanpa wildcard?

Kanggo ngatasi watesan sing mbebayani iki, kita nggunakake solusi sing ora jelas:

cp -a /source/. /target

Sing ngerti DOS lan Linux wis ngerti kabeh: ing saben folder ana 2 folder sing ora katon "." lan "..", yaiku link pseudo-folder menyang direktori saiki lan luwih dhuwur.

  • Nalika nyalin cp mriksa eksistensi lan nyoba nggawe /target/.
  • Direktori kuwi ana lan iku / target
  • File saka / sumber disalin menyang / target kanthi bener.

Dadi, gantung ing pigura sing kandel ing memori utawa ing tembok:

cp -a /source/. /target

Tumindak dhawuh iki cetha. Kabeh bakal bisa tanpa kasalahan, preduli saka apa sampeyan duwe yuta file utawa ora ana ing kabeh.

temonan

Yen sampeyan kudu nyalin kabeh file saka siji folder liyane, kita ora nggunakake wildcards, iku luwih apik kanggo nggunakake tinimbang cp digabungake karo titik ing mburi folder sumber. Iki bakal nyalin kabeh file, kalebu sing didhelikake, lan ora bakal gagal karo mayuta-yuta file utawa ora ana file.

Afterword

vmspike nyaranake versi printah kanthi asil sing padha:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

CATETAN: kasus surat T nduweni teges. Yen sampeyan nyampur, sampeyan bakal entuk sampah lengkap: arah nyalin bakal ganti.
matur nuwun:

  • Perusahaan RUVDS.COM kanggo dhukungan lan kesempatan kanggo nerbitake ing blog sampeyan ing HabrΓ©.
  • Per gambar Konsep Triple. Gambar kasebut gedhe banget lan rinci, bisa dibukak ing jendela sing kapisah.

PS Kirimi kesalahan sing sampeyan ngerteni ing pesen pribadi. Aku nambah karma kanggo iki.

cp printah: nyalin folder file kanthi bener ing *nix

Source: www.habr.com

Add a comment