cp kommando: korrekt kopiearjen fan triemmappen yn *nix

cp kommando: korrekt kopiearjen fan triemmappen yn *nix

Dit artikel sil reveal guon net-dúdlike dingen yn ferbân mei it brûken fan jokertekens by it kopiearjen, dûbelsinnich kommando gedrach cp by it kopiearjen, lykas metoaden wêrmei jo in grut oantal bestannen korrekt kinne kopiearje sûnder oer te slaan of te crashen.

Litte wy sizze dat wy alles moatte kopiearje fan 'e / source map nei de / target map.

It earste ding dat yn 't sin komt is:

cp /source/* /target

Litte wy dit kommando fuortendaliks korrigearje nei:

cp -a /source/* /target

Key -a sil taheakje kopiearjen fan alle attributen, rjochten en tafoegje rekursje. As krekte reproduksje fan rjochten net fereaske is, is in kaai genôch -r.

Nei it kopiearjen sille wy fine dat net alle bestannen binne kopiearre - bestannen begjinnend mei in punt lykas:

.profile
.local
.mc

ensafuorthinne.

Wêrom barde dit?

Omdat jokertekens wurde ferwurke troch de shell (bash yn in typysk gefal). Standert sil bash alle bestannen negearje dy't begjinne mei punten, om't it se as ferburgen behannelet. Om dit gedrach te foarkommen sille wy gedrach feroarje moatte bash mei help fan it kommando:

shopt -s dotglob

Om te soargjen dat dizze gedrachsferoaring oanhâldt nei in trochstart, kinne jo in wildcard.sh-bestân meitsje mei dit kommando yn 'e map /etc/profile.d (Miskien hat jo distribúsje in oare map).

En as der gjin bestannen binne yn 'e boarnemap, dan sil de shell neat kinne ferfange yn plak fan' e asterisk, en it kopiearjen sil ek mislearje mei in flater. Der binne opsjes tsjin dizze situaasje failglob и nullglob. Wy sille moatte ynstelle failglob, wat sil foarkomme dat it kommando wurdt útfierd. nullglob sil net wurkje, om't it in tekenrige mei jokertekens dy't gjin oerienkomst fûnen omsette yn in lege tekenrige (nul lingte), dy't foar cp sil in flater feroarsaakje.

As d'r lykwols tûzenen of mear bestannen yn 'e map binne, dan moat de oanpak fan jokertekens hielendal ferlitten wurde. It feit is dat bash wreidet jokertekens út yn in heul lange kommandorigel lykas:

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

D'r is in limyt foar de lingte fan 'e kommandorigel, dy't wy kinne fine mei it kommando:

getconf ARG_MAX

Litte wy de maksimale lingte fan 'e kommandorigel yn bytes krije:

2097152

Of:

xargs --show-limits

Wy krije sa'n ding as:

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

Dat, lit ús hielendal sûnder jokertekens dwaan.

Litte wy mar skriuwe

cp -a /source /target

En hjir wurde wy konfrontearre mei dûbelsinnigens fan gedrach cp. As de /doelmap net bestiet, dan krije wy wat wy nedich binne.

As de doelmap lykwols bestiet, dan wurde de bestannen kopiearre nei de /target/source map.

Wy kinne de /target-map net altyd foarôf wiskje, om't it bestannen kin befetsje dy't wy nedich binne en ús doel is bygelyks om de bestannen yn /target oan te foljen mei bestannen fan /source.

As de boarne- en bestimmingsmappen itselde waarden neamd, bygelyks, kopiearje wy fan /source nei /home/source, dan kinne wy ​​​​it kommando brûke:

cp -a /source /home

En nei it kopiearjen sille de bestannen yn /home/source wurde oanfolle mei bestannen fan /source.

Dit is in logysk probleem: wy kinne triemmen tafoegje yn 'e bestimmingsmap as de mappen deselde neamd wurde, mar as se oars binne, dan sil de boarne map yn' e bestimming pleatst wurde. Hoe kinne jo bestannen kopiearje fan / boarne nei / target mei cp sûnder jokertekens?

Om dizze skealike beheining om te kommen, brûke wy in net-foar de hân lizzende oplossing:

cp -a /source/. /target

Dejingen dy't bekend binne mei DOS en Linux hawwe alles al begrepen: binnen elke map binne d'r 2 ûnsichtbere mappen "." en "..", dy't pseudo-mappen binne keppelings nei de hjoeddeistige en hegere mappen.

  • By it kopiearjen cp kontrolearret foar bestean en besiket /target/ te meitsjen.
  • Sa'n map bestiet en it is /target
  • Bestannen fan /source wurde korrekt kopiearre nei /target.

Dus, hingje it yn in fet frame yn jo ûnthâld of oan 'e muorre:

cp -a /source/. /target

It gedrach fan dit kommando is dúdlik. Alles sil sûnder flaters wurkje, nettsjinsteande oft jo in miljoen of hielendal gjin bestannen hawwe.

befinings

As jo ​​moatte kopiearje allegear bestannen fan de iene map nei de oare, wy brûke gjin jokertekens, it is better om se ynstee te brûken cp kombinearre mei in perioade oan 'e ein fan' e boarne map. Dit sil alle bestannen kopiearje, ynklusyf ferburgen, en sil net mislearje mei miljoenen bestannen of hielendal gjin bestannen.

Nei wurd

vmspike suggerearre in kommandoferzje mei in ferlykber resultaat:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

OPMERKING: letterkast T hat de betsjutting. As jo ​​it mingje, krije jo folsleine rommel: de kopyrjochting sil feroarje.
Tank:

  • Bedriuwen RUVDS.COM foar stipe en de kâns om te publisearjen op myn blog op Habré.
  • Per ôfbylding Triple konsept. De foto is heul grut en detaillearre, kin iepene wurde yn in apart finster.

PS Stjoer asjebleaft alle flaters dy't jo opfalle yn in priveeberjocht. Ik ferheegje myn karma foar dit.

cp kommando: korrekt kopiearjen fan triemmappen yn *nix

Boarne: www.habr.com

Add a comment