
Selles artiklis käsitletakse mõningaid varjatud aspekte, mis on seotud 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/* /targetParandame 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 …… /targetKäsurea pikkusele on piirang, mille saame teada, kasutades käsku:
getconf ARG_MAXSaame maksimaalse käsurea pikkuse baitides:
2097152Või:
xargs --show-limitsSaame 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 /homeJa 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/. /targetNeed, 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
cpkontrollib 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
välja pakkunud sarnast tulemust andva käsu:
cp -a -T /source /target
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 toetuse ja võimaluse eest avaldada oma blogis Habras.
- Pildi eest . Pilt on väga suur ja detailne, saab avada eraldisse aknasse.
P.S. Tehtud vigade suunamine minu postkasti. Tõstan selle eest karma.
Allikas: habr.com
