Artikel ieu bakal nembongkeun sababaraha hal non-écés patali pamakéan wildcards nalika nyalin, kabiasaan paréntah ambigu cp nalika nyalin, kitu ogé métode anu ngamungkinkeun anjeun leres nyalin sajumlah ageung file tanpa skipping atanapi nabrak.
Anggap urang kedah nyalin sadayana tina folder / sumber ka folder / target.
Hal kahiji anu datang ka pikiran nyaéta:
cp /source/* /target
Hayu urang langsung ngabenerkeun paréntah ieu:
cp -a /source/* /target
konci -a bakal nambahkeun nyalin sadaya atribut, hak jeung nambahkeun recursion. Nalika réproduksi tepat hak henteu diperlukeun, konci hiji cukup -r.
Saatos nyalin, urang bakal mendakan yén henteu sadayana file disalin - file anu dimimitian ku titik sapertos:
.profile
.local
.mc
jeung sajabana.
Naha ieu kajadian?
Kusabab wildcards diolah ku cangkang (bash dina kasus biasa). Sacara standar, bash bakal malire sadaya file dimimitian ku titik-titik, sabab ngarawatna disumputkeun. Pikeun nyingkahan kabiasaan ieu urang kudu ngarobah kabiasaan bash ngagunakeun paréntah:
shopt -s dotglob
Pikeun mastikeun yén parobahan paripolah ieu tetep saatos reboot, anjeun tiasa nyiptakeun file wildcard.sh nganggo paréntah ieu dina polder. /etc/profile.d (Sugan sebaran anjeun boga folder béda).
Sareng upami henteu aya file dina diréktori sumber, cangkang moal tiasa ngagentos naon waé dina tempat tanda bintang, sareng nyalin ogé bakal gagal sareng kasalahan. Aya pilihan ngalawan kaayaan ieu failglob и nullglob. Urang bakal kedah nyetél failglob, nu bakal nyegah paréntah ti keur dieksekusi. nullglob iyeu moal jalan mun, saprak eta ngarobah string kalawan wildcards nu teu manggihan patandingan kana string kosong (enol panjang), nu keur cp bakal ngabalukarkeun kasalahan.
Nanging, upami aya rébuan file atanapi langkung dina polder, maka pendekatan wildcards kedah ditinggalkeun sadayana. kanyataan éta bash expands wildcards kana garis paréntah pisan panjang kawas:
cp -a /souce/a /source/b /source/c …… /target
Aya wates dina panjang garis paréntah, anu urang tiasa terang nganggo paréntah:
getconf ARG_MAX
Hayu urang kéngingkeun panjang maksimum garis paréntah dina bait:
2097152
Atanapi:
xargs --show-limits
Urang meunang hal kawas:
….
Maximum length of command we could actually use: 2089314
….
Janten, hayu urang ngalakukeun tanpa wildcard sadayana.
Hayu urang nulis
cp -a /source /target
Sarta di dieu urang Nyanghareupan ambiguity tina kabiasaan cp. Upami folder / target henteu aya, maka urang bakal nampi naon anu urang peryogikeun.
Nanging, upami folder targét aya, maka file éta bakal disalin kana folder / target / sumber.
Urang teu tiasa salawasna ngahapus folder /target sateuacanna, sabab tiasa ngandung file anu urang peryogikeun sareng tujuan urang, contona, pikeun nambihan file dina /target sareng file tina /sumber.
Upami polder sumber sareng tujuan namina sami, contona, urang nyalin ti / sumber ka / bumi / sumber, maka urang tiasa nganggo paréntah:
cp -a /source /home
Sareng saatos nyalin, file dina /home/source bakal ditambihan ku file tina /source.
Ieu mangrupikeun masalah logis: urang tiasa nambihan file dina diréktori tujuan upami polderna namina sami, tapi upami aranjeunna béda, polder sumber bakal disimpen di jero tujuan. Kumaha nyalin file tina / sumber ka / target nganggo cp tanpa wildcards?
Pikeun ngatasi watesan anu ngabahayakeun ieu, kami nganggo solusi anu teu jelas:
cp -a /source/. /target
Anu wawuh sareng DOS sareng Linux parantos ngartos sadayana: di jero unggal folder aya 2 folder anu teu katingali "." jeung "..", nu mangrupakeun pseudo-polder Tumbu ka directories ayeuna jeung luhur.
Nalika nyalin cp mariksa ayana sarta nyoba nyieun /target/.
Diréktori sapertos kitu aya sareng éta / target
File tina /sumber disalin ka /target leres.
Janten, gantung dina pigura anu kandel dina mémori anjeun atanapi dina témbok:
cp -a /source/. /target
Paripolah paréntah ieu jelas. Sagalana bakal jalan tanpa kasalahan, paduli naha anjeun boga sajuta file atawa euweuh pisan.
papanggihan
Upami anjeun kedah nyalin sadaya file ti hiji polder ka nu sejen, urang teu make wildcards, eta leuwih hade migunakeun eta gantina cp digabungkeun jeung titik dina tungtung folder sumber. Ieu bakal nyalin sadaya file, kalebet anu disumputkeun, sareng moal gagal sareng jutaan file atanapi henteu aya file sama sekali.
afterword
vmspike nyarankeun versi paréntah kalayan hasil anu sami: