Príkaz cp: správne kopírovanie adresárov s údajmi v *nix

Príkaz cp: správne kopírovanie adresárov s údajmi v *nix

V tomto článku sa odhalia niektoré menej zjavné aspekty spojené s používaním wildcards pri kopírovaní, nejednoznačné správanie príkazu cp pri kopírovaní, ako aj metódy umožňujúce správne kopírovať obrovské množstvo súborov bez vynechania a chybových hlásení.

Predpokladajme, že potrebujeme skopírovať všetko z priečinka /source do priečinka /target.

Prvé, čo napadne, je:

cp /source/* /target

Ihneď opravíme tento príkaz na:

cp -a /source/* /target

Parameter -a pridá kopírovanie všetkých atribútov, práv a pridá rekurziu. Keď nie je potrebné presné reprodukovanie práv, stačí parameter -r.

Po kopírovaní zistíme, že neboli skopírované všetky súbory — boli ignorované súbory začínajúce bodkou, ako sú:

.profil
.lokálny
.mc

a podobne.

Prečo sa to stalo?

Pretože wildcards spracováva shell (bash v typickom prípade). Predvolený bash ignoruje všetky súbory začínajúce bodkami, pretože ich považuje za skryté. Aby sme sa vyhli takémuto správaniu, budeme musieť zmeniť správanie bash pomocou príkazu:

shopt -s dotglob

Aby sa táto zmena správania zachovala po reštarte, môžeme vytvoriť súbor wildcard.sh s týmto príkazom v priečinku /etc/profile.d (možno vo vašej distribúcii iný priečinok).

Ak však v adresári zdroja nie sú žiadne súbory, shell nebude môcť nič priradiť na miesto hviezdičky a kopírovanie tiež skončí chybou. Proti takejto situácii máme možnosti failglob a nullglob. Budeme musieť nastaviť failglob, aby príkaz nevykonal. nullglob toto nebude fungovať, pretože premení prázdny reťazec (nulovej dĺžky) na reťazec s wildcards, čo pre cp vyvolá chybu.

Avšak, ak v priečinku je tisíc súborov a viac, je rozumné úplne sa vzdať prístupu pomocou wildcards. Ide o to, že bash rozbalí wildcards do veľmi dlhého príkazu, ako je:

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

Dĺžka príkazového riadku má obmedzenia, ktoré môžeme zistiť pomocou príkazu:

getconf ARG_MAX

Získame maximálnu dĺžku príkazového riadku v bajtoch:

2097152

Alebo:

xargs --show-limits

Získame niečo ako:

….
Maximálna dĺžka príkazu, ktorú môžeme naozaj použiť: 2089314
….

Takže, poďme sa úplne vyhnúť wildcards.

Jednoducho napíšme

cp -a /source /target

A tu sa stretneme s nejednoznačnosťou správania cp. Ak priečinok /target neexistuje, dostaneme to, čo potrebujeme.

Avšak ak priečinok target existuje, súbory budú skopírované do priečinka /target/source.

Nie vždy môžeme predtým odstrániť priečinok /target, pretože v ňom môžu byť potrebné súbory a náš cieľ, povedzme, je doplniť súbory v /target súbormi z /source.

Keby sa priečinky zdroja a príjemcu volali rovnako, napríklad keby sme kopírovali z /source do /home/source, mohli by sme použiť príkaz:

cp -a /source /home

A po skopírovaní by súbory v /home/source mali byť doplnené súbormi z /source.

Takáto logická úloha: môžeme doplniť súbory v adresári príjemcu, ak sa priečinky volajú rovnako, ale ak sú rôzne, priečinok zdroja bude umiestnený vo vnútri príjemcu. Ako skopírovať súbory z /source do /target pomocou cp bez wildcards?

Aby sme obchádzali toto nevhodné obmedzenie, používame neviditeľné riešenie:

cp -a /source/. /target

Tí, ktorí sú dobre oboznámení s DOS a Linux, už všetko pochopili: v každom priečinku existujú 2 neviditeľné priečinky „.“ a „..“, ktoré sú pseudo-priečinkami odkazujúcimi na aktuálny a nadriadený adresár.

  • Pri kopírovaní cp kontroluje existenciu a pokúša sa vytvoriť /target/.
  • Takýto adresár existuje a to je /target
  • Súbory z /source boli správne skopírované do /target.

Takže si zapamätajte v tučnej rámčekovej forme vo svojej pamäti alebo na stene:

cp -a /source/. /target

Správanie tohto príkazu je jednoznačné. Všetko bude fungovať bez chýb bez ohľadu na to, či máte milión súborov alebo žiadne.

Zhrnutie

Ak potrebujete skopírovať všetky súbory z jedného priečinka do druhého, nepoužívajte wildcards, namiesto toho je lepšie použiť cp v kombinácii s bodkou na konci priečinku zdroja. Tým sa skopírujú všetky súbory, vrátane skrytých a nezrúti sa to pri miliónoch súborov alebo úplnej absencii súborov.

Pósledok

vmspike navrhol podobný výsledný variant príkazu:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

POZOR: veľkosť písmena T má význam. Ak sa pomýlite, dostanete úplný chaos: smer kopírovania sa zmení.
Poďakovanie:

  • Spoločnosti RUVDS.COM za podporu a možnosť publikovania vo svojom blogu na Habre.
  • Za obrázok TripletConcept. Obrázok je veľmi veľký a detailný, môžete si ho otvoriť v samostatnom okne.

P.S. Zistené chyby smerujte do súkromnej správy. Zvyšujem za to karmu.

Príkaz cp: správne kopírovanie adresárov s údajmi v *nix

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster