
Selles artiklis toome välja mõned vähem tuntud asjad, mis on seotud kopeerimise, ebaselge käitumise käsuga cp kopeerimise ning meetodid, mis võimaldavad suurte hulga failide korrektset kopeerimist ilma vahelejätmiseta ja tõrgeteta.
Oletame, et peame kopeerima kõik kaustast /source kausta /target.
Esimene mõte on:
cp /source/* /targetParandame selle käsu:
cp -a /source/* /target Võti -a lisab kõigi atribuutide, õiguste ja rekursiooni kopeerimise. Kui täpset õiguste reprodutseerimist ei ole vajalik, on piisav võtme kasutamine -r.
Kopeerimise järel avastame, et mitte kõik failid ei ole kopeeritud — vahele jäid punktiga algavad failid, näiteks:
.profiil
.kohalik
.mc
ja sellelaadsed.
Kuidas see juhtus?
Sest wildcards töötleb shell (bash tüüpilisel juhul). Vaikimisi ignoreerib bash kõik punktiga algavad failid, tõlgendades neid kui peidetud. Sellise käitumise vältimiseks peame muutma käitumist bash selle käsu abil:
shopt -s dotglob Kuna see käitumise muudatus soovite pärast taaskäivitamist säilitada, saate teha faili wildcard.sh selle käsuga kausta /etc/profile.d (võib-olla on teie jaotuses teisene kaust).
Ja kui allika direktoriumis ei ole faile, siis shell ei suuda punktikest asendada ja kopeerimine lõppeb samuti veaga. Sellise olukorra vastu on valikud failglob ja nullglob. Meil on vaja seadistada failglob, mis ei lase käsul teostuda. nullglob see ei sobi, kuna see muudab wildcards versiooni, mis ei leidnud vasteid, tühjaks stringiks (nullpikkuseks), mis cp toob kaasa vea.
Kuid kui kaustas on tuhandeid faile või rohkem, tasub wildcardsi kasutamisest täielikult loobuda. Asi on selles, et bash lahendab wildcards väga pika käsirea, näiteks:
cp -a /souce/a /source/b /source/c …… /targetKäsirea pikkusele on piirang, mille saame teada käsuga:
getconf ARG_MAXSaame maksimaalse käsirea pikkuse baitides:
2097152Või:
xargs --show-limitsSaame midagi sellist:
….
Maksimaalne pikkus käsk, mida me tegelikult kasutada saame: 2089314
….Nii et jätkame wildcardsidest loobumisel.
Kirjutame lihtsalt
cp -a /source /target Ja siin seisame silmitsi ebaselguse käitumisega cp. Kui kausta /target ei eksisteeri, saame, mida vajame.
Kuid kui kaust target eksisteerib, kopeeritakse failid kausta /target/source.
Kuna alati ei saa me eelnevalt kustutada kausta /target, kuna seal võivad olla vajalikud failid, ja meie eesmärk on näiteks täiendada faile kaustas /target failidega kaustast /source.
Kui kausta allikas ja vastuvõtja nimetatakse sama, näiteks kui kopeerime kaustast /source kausta /home/source, võiksime kasutada käsku:
cp -a /source /homeJa pärast kopeerimist oleks kaustas /home/source failid täiendatud failidega kaustast /source.
Siin on üks loogiline ülesanne: me saame täiendada faile vastuvõtva kausta, kui kaustade nimed on samad, kuid kui need erinevad, siis allikakaust pannakse vastuvõtja sisse. Kuidas kopeerida faile kaustast /source kausta /target käsuga cp ilma wildcards'ita?
Selle kahjuliku piirangu ületamiseks kasutame mitte ilmselget lahendust:
cp -a /source/. /targetNeed, kes tunnevad hästi DOS-i ja Linuxi, on juba kõik aru saanud: igas kaustas on 2 nähtamatut kausta «.» ja «..», mis on pseudo-kaustad, mis viitavad vastavalt praegusele ja üleüldisele kaustale.
- Kopeerimisel
cpkontrollib see olemasolu ja proovib luua /target/. - Selline kaust eksisteerib ja see on /target
- Failid kaustast /source on korralikult kopeeritud kausta /target.
Nii et paneme nüüd endasse tugeva raami mällu või seinale:
cp -a /source/. /target
Selle käsu käitumine on ühemõtteline. Kõik töötab vigadeta, olenemata sellest, kas teil on miljon faili või neid pole üldse.
Järeldused
Kui on vajalik kopeerida kõik faile ühest kaustast teise, ei kasuta me wildcards'i, parem on kasutada cp koos punktiga allikakausta lõpus. See kopeerib kõik failid, sealhulgas peidetud ja ei lagune miljonite failide või nende täieliku puudumise korral.
Eessõna
soovis sarnast tulemust andvat käsku:
cp -a -T /source /target
cp -aT /source /target TÄHELEPANU: tähe suurus T on oluline. Kui segate ära, saate täieliku jama: kopeerimise suund muutub.
Tänud:
- Ettevõttele toetuse ja võimaluse eest avaldada oma blogis Habras.
- Pildi eest . Pilt on väga suur ja detailne, seda saab avada eraldi aknas.
P.S. Tuvastatud vead suunake isikliku sõnumi kaudu. Tõstame selle eest karmaat.
Allikas: habr.com
