Komanda cp: kopjimi i saktë i dosjeve të skedarëve në *nix

Komanda cp: kopjimi i saktë i dosjeve të skedarëve në *nix

Ky artikull do të zbulojë disa gjëra jo të dukshme që lidhen me përdorimin e shkronjat e egra gjatë kopjimit, sjellje e paqartë e komandës cp kur kopjoni, si dhe metoda që ju lejojnë të kopjoni saktë një numër të madh skedarësh pa kapërcyer ose rrëzuar.

Le të themi se duhet të kopjojmë gjithçka nga dosja /source në dosjen /target.

Gjëja e parë që të vjen ndërmend është:

cp /source/* /target

Le ta korrigjojmë menjëherë këtë komandë në:

cp -a /source/* /target

Ключ -a do të shtojë kopjimin e të gjitha atributeve, të drejtave dhe do të shtojë rekursion. Kur nuk kërkohet riprodhimi i saktë i të drejtave, mjafton një çelës -r.

Pas kopjimit, do të zbulojmë se jo të gjithë skedarët janë kopjuar - skedarët që fillojnë me një pikë si:

.profile
.local
.mc

dhe të ngjashme.

Pse ndodhi kjo?

Sepse shkronjat e egra përpunohen nga guaska (bash në një rast tipik). Si parazgjedhje, bash do të injorojë të gjithë skedarët që fillojnë me pika, pasi i trajton ato si të fshehura. Për të shmangur këtë sjellje do të duhet të ndryshojmë sjellje bash duke përdorur komandën:

shopt -s dotglob

Për të siguruar që ky ndryshim i sjelljes të vazhdojë pas një rindezjeje, mund të krijoni një skedar wildcard.sh me këtë komandë në dosje /etc/profile.d (Ndoshta shpërndarja juaj ka një dosje tjetër).

Dhe nëse nuk ka skedarë në drejtorinë burimore, atëherë guaska nuk do të jetë në gjendje të zëvendësojë asgjë në vend të yllit, dhe kopjimi gjithashtu do të dështojë me një gabim. Ka mundësi kundër kësaj situate failglob и nullglob. Do të na duhet të vendosim failglob, e cila do të parandalojë ekzekutimin e komandës. nullglob nuk do të funksionojë, pasi konverton një varg me shkronja të këqija që nuk gjetën përputhje në një varg bosh (gjatësi zero), i cili për cp do të shkaktojë një gabim.

Megjithatë, nëse ka mijëra skedarë ose më shumë në dosje, atëherë qasja e shkronjave të egra duhet të braktiset fare. Fakti është se bash zgjeron shkronjat e egra në një linjë komande shumë të gjatë si:

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

Ekziston një kufi në gjatësinë e vijës së komandës, të cilën mund ta zbulojmë duke përdorur komandën:

getconf ARG_MAX

Le të marrim gjatësinë maksimale të vijës së komandës në bajt:

2097152

ose:

xargs --show-limits

Ne marrim diçka të tillë:

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

Pra, le të bëjmë pa karaktere të egra krejtësisht.

Le të shkruajmë

cp -a /source /target

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

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

Ne nuk mund ta fshijmë gjithmonë dosjen /target paraprakisht, pasi mund të përmbajë skedarë që na duhen dhe qëllimi ynë, për shembull, është të plotësojmë skedarët në /target me skedarë nga /source.

Nëse dosjet e burimit dhe të destinacionit emërtohen njësoj, për shembull, ne po kopjonim nga /source në /home/source, atëherë mund të përdorim komandën:

cp -a /source /home

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

Ky është një problem logjik: ne mund të shtojmë skedarë në drejtorinë e destinacionit nëse dosjet janë emërtuar njësoj, por nëse janë të ndryshëm, atëherë dosja burimore do të vendoset brenda destinacionit. Si të kopjoni skedarët nga /source në /target duke përdorur cp pa shkronja të ngurta?

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

cp -a /source/. /target

Ata që janë të njohur me DOS dhe Linux kanë kuptuar tashmë gjithçka: brenda çdo dosje ka 2 dosje të padukshme "." dhe “..”, të cilat janë lidhje të pseudo-dosjeve në drejtoritë aktuale dhe ato më të larta.

  • Gjatë kopjimit cp kontrollon ekzistencën dhe përpiqet të krijojë /target/.
  • Një direktori e tillë ekziston dhe është /target
  • Skedarët nga /source kopjohen në / target saktë.

Pra, vareni në një kornizë të theksuar në kujtesën tuaj 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ë.

Gjetjet

Nëse keni nevojë të kopjoni të gjithë skedarë nga një dosje në tjetrën, ne nuk përdorim shkronja të egra, është më mirë t'i përdorim ato cp kombinuar me një pikë në fund të dosjes burimore. Kjo do të kopjojë të gjithë skedarët, duke përfshirë ato të fshehura, dhe nuk do të dështojë me miliona skedarë ose pa skedarë fare.

pasthënje

vmspike sugjeroi një version komandimi me një rezultat të ngjashëm:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

SHËNIM: rast letre T ka kuptimin. Nëse e përzieni, do të merrni mbeturina të plota: drejtimi i kopjimit do të ndryshojë.
Faleminderit:

  • Kompanitë RUVDS.COM për mbështetjen dhe mundësinë për të publikuar në blogun tuaj në Habré.
  • Për imazh Koncepti i trefishtë. Fotografia është shumë e madhe dhe e detajuar, mund të hapet në një dritare të veçantë.

PS Ju lutemi dërgoni çdo gabim që vini re në një mesazh privat. Unë rris karmën time për këtë.

Komanda cp: kopjimi i saktë i dosjeve të skedarëve në *nix

Burimi: www.habr.com

Shto një koment