Ekipi cp: kopjimi i duhur i dosjeve me skedarë në *nix

Ekipi cp: kopjimi i duhur i dosjeve me skedarë në *nix

Në këtë artikull do të zbulojmë disa gjëra të pakapshme që lidhen me përdorimin wildcards në procesin e kopjimit, sjelljet e paqarta të komandës cp të kopjimit, si dhe mënyrat që lejojnë kopjimin korrekte të një sasi të madhe skedarësh pa mungesa dhe dështime.

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

E para që na vjen në mend është:

cp /source/* /target

Ta korrigjojmë menjëherë këtë komandë në:

cp -a /source/* /target

Çelësi -a e cila do të kopjojë të gjitha atributet, të drejtat dhe do të shtojë rekursivitetin. Kur nuk kërkohet një riprodhim i saktë i të drejtave, mjafton çelësi -r.

Pas kopjimit, do të zbulojmë se nuk u kopjuan të gjitha skedarët — u injoruan skedarët që fillonin me pikë si:

.profil
.lokal
.mc

dhe të ngjashme.

Pse ndodhi kështu?

Sepse wildcards përpunon shell-in (bash në rastin tipik). Nga ana e tij, bash-i injoron të gjitha skedarët që fillojnë me pika, duke i trajtuar ato si të fshehur. Për të shmangur këtë sjellje, na duhet të ndryshojmë atë bash me komandën:

shopt -s dotglob

Për të ruajtur këtë ndryshim të sjelljes pas rindizjes, mund të krijojmë një skedar wildcard.sh me këtë komandë në dosjen /etc/profile.d (ndoshta në shpërndarjen tuaj është një dosje tjetër).

Dhe nëse në dosjen burimore nuk ka skedarë, atëherë shell-i nuk do të jetë në gjendje të vendosë asgjë në vend të yllit, dhe kopjimi gjithashtu do të përfundojë me një gabim. Ka mundësi kundër kësaj situate failglob dhe nullglob. Na duhen failglob, e cila nuk do të lejojë komandën të realizohet. nullglob nuk do të funksionojë, pasi që ajo do ta kthejë rreshtin me wildcards pa përputhje në një rresht të zbrazët (me gjatësi zero), gjë që për cp do të shkaktojë një gabim.

Megjithatë, nëse në dosje ka mijëra skedarë e më shumë, atëherë duhet të heqim dorë nga qasja me përdorimin e wildcards. Arsyeja është se bash shndërron wildcards në një varg shumë të gjatë të komandës si:

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

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

getconf ARG_MAX

Do të marrim gjatësi maksimale të vargut të komandës në byte:

2097152

Ose:

xargs --show-limits

Do të marrim diçka të ngjashme me:

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

Pra, le të anashkalojmë krejtësisht wildcards.

Thjesht le të shkruajmë

cp -a /source /target

Dhe këtu do të përballemi me paqartësinë e sjelljes cp. Nëse dosja /target nuk ekziston, do të marim atë që na nevojitet.

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

Nuk mund ta fshijmë gjithmonë paraprakisht dosjen /target, pasi mund të ketë skedarë të nevojshëm dhe qëllimi ynë, për shembull, është të plotësojmë skedarët në /target me skedarët nga /source.

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

cp -a /source /home

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

Ja një enigmë logjike: ne mund të plotësojmë skedarët në direktorinë e pranimit nëse dosjet janë njësoj, por nëse ato ndryshojnë, dosja burim do të vendoset brenda pranueses. Si të kopjojmë skedarët nga /source në /target duke përdorur cp pa wildcards?

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

cp -a /source/. /target

Ata që janë mirë të njohur me DOS dhe Linux tashmë e kanë kuptuar: brenda çdo dosje ekzistojnë 2 dosje të padukshme ‘.’ dhe ‘..’, të cilat janë dosje-përfaqësuese që tregojnë drejt direktorisë aktuale dhe asaj të lartë.

  • Gjatë kopjimit cp kontrollon ekzistencën dhe përpiqet të krijojë /target/.
  • Një direktor është në ekzistencë dhe kjo është /target.
  • Skedarët nga /source janë kopjuar saktësisht në /target.

Pra, le të vendosim në një kornizë të trashë në memorien tonë ose në mur:

cp -a /source/. /target

Sjellja e kësaj komande është e qartë. Gjithçka do të funksionojë pa gabime, pavarësisht nëse keni një milion skedarë ose asnjë.

Përfundimet

Nëse duhet të kopjoni të gjithë 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ë gjitha skedarët, duke përfshirë të fshehtit dhe nuk do të dështojë me miliona skedarë ose në mungesë të plotë skedarësh.

Pasthënie

vmspike ofroi një variant të ngjashëm për rezultatin e komandës:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

KËSHILLË: regjistri i shkronjave T ka rëndësi. Nëse e ngatërrojnë, do të merrni një ngatërresë totale: drejtimi i kopjimit do të ndryshojë.
Falënderime:

  • Kompani RUVDS.COM për mbështetje dhe mundësinë për publikim në blogun e vet 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. Gabimet e vërejtura dërgoni në mesazhe private. Po e rrit karmín time për këtë.

Ekipi cp: kopjimi i duhur i dosjeve me skedarë në *nix

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster