cp skipun: rétt afrita skráarmöppur í *nix

cp skipun: rétt afrita skráarmöppur í *nix

Þessi grein mun sýna nokkra hluti sem ekki eru augljósir sem tengjast notkun á jokertákn við afritun, óljós skipunarhegðun cp við afritun, svo og aðferðir sem gera þér kleift að afrita gríðarlegan fjölda skráa á réttan hátt án þess að sleppa eða hrynja.

Segjum að við þurfum að afrita allt frá /source möppunni í /target möppuna.

Það fyrsta sem kemur upp í hugann er:

cp /source/* /target

Við skulum leiðrétta þessa skipun strax í:

cp -a /source/* /target

Lykill -a mun bæta við afritun af öllum eiginleikum, réttindum og bæta við endurtekningu. Þegar ekki er þörf á nákvæmri endurgerð réttinda nægir lykill -r.

Eftir afritun munum við komast að því að ekki voru allar skrár afritaðar - skrár sem byrja á punkti eins og:

.profile
.local
.mc

og þess háttar.

Hvers vegna gerðist þetta?

Vegna þess að algildi eru unnin af skelinni (bash í dæmigerðu tilfelli). Sjálfgefið er að bash hunsar allar skrár sem byrja á punktum, þar sem það meðhöndlar þær sem faldar. Til að forðast þessa hegðun verðum við að breyta hegðun bash nota skipunina:

shopt -s dotglob

Til að tryggja að þessi hegðunarbreyting haldist eftir endurræsingu geturðu búið til wildcard.sh skrá með þessari skipun í möppunni /etc/profile.d (Kannski er dreifingin þín með aðra möppu).

Og ef það eru engar skrár í upprunaskránni, þá mun skelin ekki geta komið í staðinn fyrir neitt í stað stjörnunnar, og afritun mun einnig mistakast með villu. Það eru möguleikar á móti þessu ástandi failglob и nullglob. Við munum þurfa að stilla failglob, sem kemur í veg fyrir að skipunin sé framkvæmd. nullglob mun ekki virka, þar sem það breytir streng með algildisstöfum sem fundu ekki samsvörun í tóman streng (núll lengd), sem fyrir cp mun valda villu.

Hins vegar, ef það eru þúsundir skráa eða fleiri í möppunni, þá ætti algerlega að sleppa algildisaðferðinni. Staðreyndin er sú bash stækkar algildi í mjög langa skipanalínu eins og:

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

Það eru takmörk á lengd skipanalínunnar, sem við getum komist að með því að nota skipunina:

getconf ARG_MAX

Við skulum fá hámarkslengd skipanalínunnar í bætum:

2097152

Eða:

xargs --show-limits

Við fáum eitthvað eins og:

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

Svo, við skulum vera án algildisstafa með öllu.

Við skulum bara skrifa

cp -a /source /target

Og hér stöndum við frammi fyrir tvíræðni í hegðun cp. Ef /target mappan er ekki til, þá fáum við það sem við þurfum.

Hins vegar, ef markmöppan er til, þá verða skrárnar afritaðar í /target/source möppuna.

Við getum ekki alltaf eytt /target möppunni fyrirfram, þar sem hún gæti innihaldið skrár sem við þurfum og markmið okkar er til dæmis að bæta við skrárnar í /target með skrám frá /source.

Ef uppruna- og áfangamöppurnar hétu það sama, til dæmis, við vorum að afrita frá /source til /home/source, þá gætum við notað skipunina:

cp -a /source /home

Og eftir að hafa verið afrituð myndu skrárnar í /home/source bætast við skrár frá /source.

Þetta er rökrétt vandamál: við getum bætt við skrám í áfangamöppuna ef möppurnar heita það sama, en ef þær eru mismunandi, þá verður upprunamöppan sett inni á áfangastaðnum. Hvernig á að afrita skrár frá /source til /target með því að nota cp án algildisstafa?

Til að komast framhjá þessari skaðlegu takmörkun notum við ekki augljósa lausn:

cp -a /source/. /target

Þeir sem þekkja DOS og Linux hafa þegar skilið allt: inni í hverri möppu eru 2 ósýnilegar möppur "." og "..", sem eru gervimöppur tenglar á núverandi og hærri möppur.

  • Við afritun cp athugar hvort það sé til og reynir að búa til /target/.
  • Slík mappa er til og hún er /target
  • Skrár frá /source eru afritaðar á /target rétt.

Svo, hengdu það í feitletraðan ramma í minni þitt eða á vegginn:

cp -a /source/. /target

Hegðun þessarar skipunar er skýr. Allt mun virka án villna, sama hvort þú ert með milljón skrár eða engar.

Niðurstöður

Ef þú þarft að afrita allt skrár úr einni möppu í aðra, við notum ekki jokertákn, það er betra að nota þau í staðinn cp ásamt punkti í lok frummöppunnar. Þetta mun afrita allar skrár, þar á meðal faldar, og mun ekki mistakast með milljónir skráa eða engar skrár yfirleitt.

Eftirsögn

vmspike lagði til skipanaútgáfu með svipaðri niðurstöðu:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

ATH: bréfamál T hefur merkinguna. Ef þú blandar því saman færðu algjört rusl: afritunarstefnan mun breytast.
Takk:

  • Fyrirtæki RUVDS.COM fyrir stuðning og tækifæri til að birta á blogginu þínu á Habré.
  • Á hverja mynd Þrefalt hugtak. Myndin er mjög stór og ítarleg, hægt að opna hana í sérstökum glugga.

PS Vinsamlegast sendu allar villur sem þú tekur eftir í einkaskilaboðum. Ég eykur karma fyrir þetta.

cp skipun: rétt afrita skráarmöppur í *nix

Heimild: www.habr.com

Bæta við athugasemd