
Ky artikull do të zbulojë disa aspekte të fshehta që lidhen me përdorimin 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/* /targetMenjë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 …… /targetKa një kufi për gjatësi të komandës, të cilin mund ta zbulojmë duke përdorur komandën:
getconf ARG_MAXNe do të marrim gjatësi maksimale të komandës në byte:
2097152Ose:
xargs --show-limitsNe 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 /homeDhe 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/. /targetAta 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
cpverifikon 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
ka propozuar një opsion të ngjashëm rezultatit të komandës:
cp -a -T /source /target
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 për mbështetje dhe mundësinë e publikimit në blogun e tij në Habrë.
- Për imazhin . 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ë.
Burimi: habr.com
