Meeskond cp: õiged failide ja kaustade kopeerimine *nix'is

Meeskond cp: õiged failide ja kaustade kopeerimine *nix'is

Selles artiklis käsitletakse mõningaid varjatud aspekte, mis on seotud wildcards kopeerimise, käskude ebaselge käitumisega cp kopeerimisel ning viise, kuidas õigesti kopeerida tohutult faile ilma vahelt jääkide ja tõrgeteta.

Oletame, et peame kopeerima kõik kaustast /source kausta /target.

Esimene mõte on:

cp /source/* /target

Parandame selle käsku nii:

cp -a /source/* /target

Ala -a lisab kõikide atribuute, õiguste ja rekursiooni kopeerimise. Kui täpne õiguste taastamine ei ole vajalik, piisab ainult võtme kasutamisest. -r.

Pärast kopeerimist avastame, et kõik failid ei olnud kopeeritud — tähelepanuta jäid failid, mis algavad punktiga, nagu:

.profiil
.kohalik
.mc

ja sarnased.

Kuidas see juhtus?

Sest wildcards töötab shellis (bash tüüpiliselt). Vaikimisi bash ignoreerib kõiki faile, mis algavad punktidega, kuna need tõlgendatakse kui peidetud. Sellise käitumise vältimiseks peame muutma bash käsku:

shopt -s dotglob

Selle käitumise muutmise säilitamiseks pärast taaskäivitamist võite luua fail wildcard.sh selle käsuga kaustas /etc/profile.d (võib-olla on teie distributsioonis teine kaust).

Ja kui allika kaustas ei ole faile, ei saa shell midagi tärniga asendada ja kopeerimine lõpeb samuti veaga. Sellise olukorra vältimiseks on olemas valikud failglob ja nullglob. Me peame seadma failglob, mis ei lase käsklusel täituda. nullglob ei sobi, kuna see muudab tärniga vastet leidmata jäänud rea tühjaks reaksi (nullpikkuseks), mis toob kaasa cp vea.

Kuid kui kaustas on tuhandeid faile või rohkem, siis tasub tärniga lähenemisest sootuks loobuda. Asi on selles, et bash arendab tärne väga pikaks käsureaks nagu:

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

Käsurea pikkusele on piirang, mille saame teada, kasutades käsku:

getconf ARG_MAX

Saame maksimaalse käsurea pikkuse baitides:

2097152

Või:

xargs --show-limits

Saame midagi sellist:

…..
Maksimaalne pikkus käsust, mida me tõeliselt kasutada saame: 2089314
….

Nii et jätkame ilma tärnideta.

Lihtsalt kirjutame

cp -a /source /target

Ja siin seisame silmitsi käitumise ebamugavusega cp. Kui kaust /target ei eksisteeri, saame seda, mida vajame.

Kuid kui sihtkaust on olemas, kopeeritakse failid kausta /target/source.

Me ei pruugi alati varem kausta /target kustutada, kuna seal võivad olla vajalikud failid ja meie eesmärk on, näiteks, täiendada faile kaustas /target failidega kaustast /source.

Kui allika- ja vastuvõtu kaustad oleksid sama nimega, näiteks kopeerides kaustast /source kausta /home/source, võiks kasutada käsku:

cp -a /source /home

Ja pärast kopeerimist oleksid failid kaustas /home/source täiendetud failidega kaustast /source.

Selline loogiline mõistatus: me saame täiendada faile vastuvõtu kaustas, kui kaustade nimed on samad, kuid kui need erinevad, asetatakse allika kaust vastuvõtja sisse. Kuidas kopeerida faile kaustast /source kausta /target kasutades cp-d ilma wildcards-ta?

Selle kahjuliku piiri vältimiseks kasutame mitteülemise lahendust:

cp -a /source/. /target

Need, kes tunnevad hästi DOS-i ja Linuxi, on juba kõik aru saanud: iga kausta sees on 2 nähtamatut kausta «.» ja «..», mis on psühholoogilised kaustad viidatud praegusele ja ülemisele kaustale.

  • Kopeerimise ajal cp kontrollib olemasolu ja üritab luua /target/.
  • Selline kaust on olemas ja see on /target.
  • Failid on õigesti kopeeritud kaustast /source kausta /target.

Seega, paneme selle oma mälu või seina paksu raamiga kinni:

cp -a /source/. /target

Selle käsu käitumine on üheselt mõistetav. Kõik töötab tõrgeteta, olenemata sellest, kas teil on miljon faili või ei ole neid üldse.

Järeldused

Kui on vaja kopeerida kõik faile ühest kaustast teise, ei kasuta wildcards, selle asemel on parem kasutada cp koos punktiga lõpus allika kaustast. See kopeerib kõik failid, sealhulgas varjatud failid, ja ei kuku kokku miljonite failide või täieliku puudumise korral.

Järelsõna

vmspike välja pakkunud sarnast tulemust andva käsu:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

TÄHELEPANU: tähe suurus T on oluline. Kui eksite, saate täieliku segaduse: kopeerimise suund muutub.
Aitäh:

  • Ettevõte RUVDS.COM toetuse ja võimaluse eest avaldada oma blogis Habras.
  • Pildi eest TripletConcept. Pilt on väga suur ja detailne, saab avada eraldisse aknasse.

P.S. Tehtud vigade suunamine minu postkasti. Tõstan selle eest karma.

Meeskond cp: õiged failide ja kaustade kopeerimine *nix'is

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster