cp meeskond: õige kaustade ja failide kopeerimine *nixis

cp meeskond: õige kaustade ja failide kopeerimine *nixis

Selles artiklis toome välja mõned vähem tuntud asjad, mis on seotud wildcards 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/* /target

Parandame 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 …… /target

Käsirea pikkusele on piirang, mille saame teada käsuga:

getconf ARG_MAX

Saame maksimaalse käsirea pikkuse baitides:

2097152

Või:

xargs --show-limits

Saame 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 /home

Ja 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/. /target

Need, 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 cp kontrollib 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

vmspike soovis sarnast tulemust andvat käsku:

cp -a -T /source /target

Oz_Alex

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 RUVDS.COM toetuse ja võimaluse eest avaldada oma blogis Habras.
  • Pildi eest TripletConcept. 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.

cp meeskond: õige kaustade ja failide kopeerimine *nixis

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster