Ekipi cp: kopjimi i saktë i dosjeve dhe dosjeve në *nix

Ekipi cp: kopjimi i saktë i dosjeve dhe dosjeve në *nix

Ky artikull do të zbulojë disa aspekte të fshehta që lidhen me përdorimin wildcard-eve në kopjim, sjelljen e paqartë të komandës cp në kopjim, si dhe mënyra që lejojnë kopjimin e një sasi të madhe skedarësh pa lëshime dhe gabime.

Supozoni se na nevojitet të kopjojmë gjithçka nga dosja /source në dosjen /target.

E para që vije në mendje është:

cp /source/* /target

Menjëherë do ta korrigjojmë këtë komandë në:

cp -a /source/* /target

Çelësi -a do të shtojë kopimin e të gjitha atributeve, të drejtave dhe do të shtojë rekursivitet. Kur nuk është e nevojshme të riprodhohen saktësisht të drejtat, mjafton çelësi -r.

Pas kopjimit, ne do të zbulojmë se nuk janë kopjuar të gjithë skedarët — janë injoruar skedarët që fillojnë me pikë, si:

.profil
.lokal
.mc

dhe të ngjashme.

Pse ndodhi kështu?

Sepse wildcard-et i përpunon shell-i (bash në rastin tipik). Nga përkufizimi, bash i injoron të gjithë skedarët që fillojnë me pika, pasi i interpreton ata si të fshehur. Për të shmangur këtë sjellje, na duhet të ndryshojmë sjelljen bash me komandën:

shopt -s dotglob

Për të ruajtur këtë ndryshim sjelljeje pas rinisjes, mund të krijoni një skedë wildcard.sh me këtë komandë në dosjen /etc/profile.d (ndoshta në shpërndarjen tuaj është ndryshe).

Nëse nuk ka skedarë në direktorinë burimore, atëherë shell nuk mund të zëvendësojë asgjë në vend të yllit, dhe kështu kopjimi do të përfundojë me një gabim. Ka disa opsione për të parandaluar një situatë të tillë. failglob dhe nullglob. Na nevojitet të vendosim failglob, e cila nuk do të lejojë komandën të kryhet. nullglob nuk do të funksionojë, pasi ajo e kthen një varg të paqëndrueshëm nga wildcards që nuk kanë gjetur përputhje në një varg bosh (me gjatësi zero), e cila për cp do të shkaktojë një gabim.

Megjithatë, nëse ka mijëra skedarë në dosje, atëherë duhet të heqim dorë nga qasja me përdorimin e wildcards. Problemi është se bash shqipron wildcards në një komandë shumë të gjatë të tillë si:

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

Ka një kufi për gjatësi të komandës, të cilin mund ta zbulojmë duke përdorur komandën:

getconf ARG_MAX

Ne do të marrim gjatësi maksimale të komandës në byte:

2097152

Ose:

xargs --show-limits

Ne do të marrim diçka si:

….
Gjatësia maksimale e komandës që mund të përdorim në të vërtetë: 2089314
….

Pra, le të kalojmë krejt pa përdorimin e wildcards.

Thjesht le të shkruajmë

cp -a /source /target

Dhe këtu do të përballim me një paqartësi të sjelljes cp. Nëse dosja /target nuk ekziston, atëherë do të marrim atë që na nevojitet.

Megjithatë, nëse ekziston dosja target, skedarët do të kopjohen në dosjen /target/source.

Nuk mund të fshijmë gjithmonë më parë dosjen /target, pasi aty mund të jenë skedarë të nevojshëm dhe qëllimi ynë, le të themi, është të plotësojmë skedarët në /target me skedarët nga /source.

Nëse dosjet e burimit dhe të pranimit do të quheshin të njëjta, për shembull, nëse do të kopjonim nga /source në /home/source, do të mund të përdornim komandën:

cp -a /source /home

Dhe pas kopjimit skedarët në /home/source do të ishin plotësuar me skedarët nga /source.

Një problem logjik i tillë: ne mund të plotësojmë skedarët në direktorinë e pranimit, nëse dosjet quhen njësoj, por nëse ato ndahen, dosja burimore do të vendoset brenda pranueses. Si mund ta kopjojmë skedarët nga /source në /target me ndihmën e cp pa wildcards?

Për të anashkaluar këtë kufizim të dëmshëm ne përdorim një zgjidhje jo të dukshme:

cp -a /source/. /target

Ata që janë mirë të njohur me DOS dhe Linux tashmë e kuptojnë gjithçka: brenda çdo dosjeje ka dy dosje të padukshme “.” dhe “..”, që janë pseudo-dosje lidhëse për direktorinë aktuale dhe atë më të lartë.

  • Gjatë kopjimit cp verifikon ekzistencën dhe përpiqet të krijojë /target/.
  • Një dosje e tillë ekziston dhe kjo është /target.
  • Skedarët nga /source janë kopjuar në /target me sukses.

Pra, ta kemi në mendje ose ta varim në një kornizë të trashë në mur:

cp -a /source/. /target

Sjellja e këtij komandi është e qartë. Çdo gjë do të funksionojë pa gabime pavarësisht nëse keni miliona skedarë ose asnjë prej tyre.

Përfundimet

Nëse është e nevojshme të kopjoni të gjitha skedarët nga një dosje në një tjetër, mos përdorni wildcards, në vend të tyre është më mirë të përdorni cp në kombinim me pikën në fund të dosjes burim. Kjo do të kopjojë të gjithë skedarët, duke përfshirë të fshehtat dhe nuk do të bjerë në dështim me miliona skedarë ose mungesë të plotë skedarësh.

Pasthënie

vmspike ka propozuar një opsion të ngjashëm rezultatit të komandës:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

KUJDES: shkronja T ka rëndësi. Nëse e ngatërroni, do të merrni një kaos të plotë: drejtimi i kopjimit do të ndryshojë.
Falënderime:

  • Kompania RUVDS.COM për mbështetje dhe mundësinë e publikimit në blogun e tij në Habrë.
  • Për imazhin TripletConcept. Imazhi është shumë i madh dhe i detajuar, mund të hapet në një dritare të veçantë.

P.S. Dërgoni gabimet e vërejtura në mesazh privat. Po e rris karmën për këtë.

Ekipi cp: kopjimi i saktë i dosjeve dhe dosjeve në *nix

Burimi: habr.com

Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë 🔥 Bli një hosting të besueshëm për faqet me mbrojtje DDoS, VPS VDS serverë | ProHoster