cp command: wastong pagkopya ng mga file folder sa *nix

cp command: wastong pagkopya ng mga file folder sa *nix

Ang artikulong ito ay magbubunyag ng ilang di-halatang bagay na may kaugnayan sa paggamit ng mga wildcard kapag nangongopya, hindi maliwanag na pag-uugali ng utos cp kapag kinokopya, pati na rin ang mga pamamaraan na nagbibigay-daan sa iyo upang wastong kopyahin ang isang malaking bilang ng mga file nang hindi lumalaktaw o nag-crash.

Sabihin nating kailangan nating kopyahin ang lahat mula sa /source folder hanggang sa /target na folder.

Ang unang bagay na pumapasok sa isip ay:

cp /source/* /target

Agad nating itama ang utos na ito sa:

cp -a /source/* /target

Key -a ay magdaragdag ng pagkopya ng lahat ng mga katangian, mga karapatan at magdagdag ng recursion. Kapag hindi kinakailangan ang eksaktong pagpaparami ng mga karapatan, sapat na ang isang susi -r.

Pagkatapos ng pagkopya, makikita namin na hindi lahat ng mga file ay nakopya - mga file na nagsisimula sa isang tuldok tulad ng:

.profile
.local
.mc

at mga katulad nito.

Bakit nangyari ito?

Dahil ang mga wildcard ay pinoproseso ng shell (bash sa karaniwang kaso). Bilang default, babalewalain ng bash ang lahat ng mga file na nagsisimula sa mga tuldok, dahil tinatrato nito ang mga ito bilang nakatago. Upang maiwasan ang pag-uugaling ito, kailangan nating baguhin ang pag-uugali bash gamit ang command:

shopt -s dotglob

Upang matiyak na magpapatuloy ang pagbabago sa gawi na ito pagkatapos ng pag-reboot, maaari kang lumikha ng wildcard.sh file na may ganitong command sa folder /etc/profile.d (Marahil ang iyong pamamahagi ay may ibang folder).

At kung walang mga file sa direktoryo ng pinagmulan, kung gayon ang shell ay hindi magagawang palitan ang anumang bagay sa lugar ng asterisk, at ang pagkopya ay mabibigo din sa isang error. May mga pagpipilian laban sa sitwasyong ito failglob ΠΈ nullglob. Kakailanganin nating itakda failglob, na pipigil sa utos na maisakatuparan. nullglob hindi gagana, dahil kino-convert nito ang isang string na may mga wildcard na hindi nakahanap ng tugma sa isang walang laman na string (zero ang haba), na para sa cp magdudulot ng error.

Gayunpaman, kung mayroong libu-libong mga file o higit pa sa folder, ang diskarte sa mga wildcard ay dapat na iwanan nang buo. Sa katotohanan ay bash nagpapalawak ng mga wildcard sa isang napakahabang command line tulad ng:

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

May limitasyon sa haba ng command line, na malalaman natin gamit ang command:

getconf ARG_MAX

Kunin natin ang maximum na haba ng command line sa bytes:

2097152

Или:

xargs --show-limits

Nakakakuha kami ng isang bagay tulad ng:

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

Kaya, gawin natin nang walang mga wildcard sa kabuuan.

Magsulat na lang tayo

cp -a /source /target

At dito tayo ay nahaharap sa kalabuan ng pag-uugali cp. Kung wala ang /target na folder, makukuha natin ang kailangan natin.

Gayunpaman, kung umiiral ang target na folder, ang mga file ay makokopya sa /target/source folder.

Hindi namin palaging tatanggalin ang /target na folder nang maaga, dahil maaaring naglalaman ito ng mga file na kailangan namin at ang aming layunin, halimbawa, ay dagdagan ang mga file sa /target ng mga file mula sa /source.

Kung pareho ang pangalan ng source at destination folder, halimbawa, kinokopya namin mula sa /source sa /home/source, maaari naming gamitin ang command:

cp -a /source /home

At pagkatapos makopya, ang mga file sa /home/source ay pupunan ng mga file mula sa /source.

Ito ay isang lohikal na problema: maaari tayong magdagdag ng mga file sa direktoryo ng patutunguhan kung pareho ang pangalan ng mga folder, ngunit kung magkaiba ang mga ito, ilalagay ang source folder sa loob ng patutunguhan. Paano kopyahin ang mga file mula sa /source sa /target gamit ang cp nang walang mga wildcard?

Upang malampasan ang nakakapinsalang limitasyong ito, gumagamit kami ng hindi halatang solusyon:

cp -a /source/. /target

Ang mga pamilyar sa DOS at Linux ay naunawaan na ang lahat: sa loob ng bawat folder ay mayroong 2 hindi nakikitang folder "." at "..", na mga pseudo-folder na link sa kasalukuyan at mas mataas na mga direktoryo.

  • Kapag nangongopya cp sinusuri ang pagkakaroon at sinusubukang lumikha ng /target/.
  • Ang nasabing direktoryo ay umiiral at ito ay /target
  • Ang mga file mula sa /source ay kinopya sa /target nang tama.

Kaya, isabit ito sa isang naka-bold na frame sa iyong memorya o sa dingding:

cp -a /source/. /target

Ang pag-uugali ng utos na ito ay malinaw. Lahat ay gagana nang walang mga error, hindi alintana kung mayroon kang isang milyong mga file o wala sa lahat.

Natuklasan

Kung kailangan mong kopyahin lahat mga file mula sa isang folder patungo sa isa pa, hindi kami gumagamit ng mga wildcard, mas mahusay na gamitin ang mga ito sa halip cp pinagsama sa isang tuldok sa dulo ng source folder. Kokopyahin nito ang lahat ng mga file, kabilang ang mga nakatago, at hindi mabibigo sa milyun-milyong file o walang mga file.

afterword

vmspike nagmungkahi ng isang bersyon ng command na may katulad na resulta:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

NOTE: letter case T may kahulugan. Kung paghaluin mo ito, makakakuha ka ng kumpletong basura: magbabago ang direksyon ng pagkopya.
Mga Pasasalamat:

  • Mga kumpanya RUVDS.COM para sa suporta at pagkakataong mag-publish sa iyong blog sa HabrΓ©.
  • Bawat larawan Triple Konsepto. Ang larawan ay napakalaki at detalyado, maaaring mabuksan sa isang hiwalay na window.

PS Mangyaring magpadala ng anumang mga error na napansin mo sa isang pribadong mensahe. Taasan ko ang karma ko para dito.

cp command: wastong pagkopya ng mga file folder sa *nix

Pinagmulan: www.habr.com

Magdagdag ng komento