
V tomto článku sa odhalia niektoré menej zjavné aspekty spojené s používaním 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/* /targetIhneď 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 …… /targetDĺžka príkazového riadku má obmedzenia, ktoré môžeme zistiť pomocou príkazu:
getconf ARG_MAXZískame maximálnu dĺžku príkazového riadku v bajtoch:
2097152Alebo:
xargs --show-limitsZí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 /homeA 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/. /targetTí, 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í
cpkontroluje 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
navrhol podobný výsledný variant príkazu:
cp -a -T /source /target
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 za podporu a možnosť publikovania vo svojom blogu na Habre.
- Za obrázok . 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.
Zdroj: habr.com
