príkaz cp: správne skopírujte priečinky súborov do *nix

príkaz cp: správne skopírujte priečinky súborov do *nix

Tento článok odhalí niektoré veci, ktoré nie sú zrejmé z používania zástupné znaky pri kopírovaní nejednoznačné správanie príkazov cp pri kopírovaní, ako aj metódy, ktoré umožňujú správne skopírovať veľké množstvo súborov bez preskakovania alebo zlyhania.

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

Prvá vec, ktorá vás napadne, je:

cp /source/* /target

Okamžite opravíme tento príkaz na:

cp -a /source/* /target

kľúč -a pridá kopírovanie všetkých atribútov, práv a pridá rekurziu. Ak sa nevyžaduje presná reprodukcia práv, postačí kľúč -r.

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

.profile
.local
.mc

a podobne.

Prečo sa to stalo?

Pretože zástupné znaky spracováva shell (bash v typickom prípade). V predvolenom nastavení bude bash ignorovať všetky súbory začínajúce bodkami, pretože ich považuje za skryté. Aby sme sa vyhli tomuto správaniu, budeme musieť zmeniť správanie bash pomocou príkazu:

shopt -s dotglob

Aby ste zabezpečili, že táto zmena správania pretrvá aj po reštarte, môžete vytvoriť súbor wildcard.sh s týmto príkazom v priečinku /etc/profile.d (Možno má vaša distribúcia iný priečinok).

A ak v zdrojovom adresári nie sú žiadne súbory, shell nebude môcť nahradiť hviezdičkou nič a kopírovanie tiež zlyhá s chybou. Proti tejto situácii existujú možnosti failglob и nullglob. Budeme musieť nastaviť failglob, čo zabráni vykonaniu príkazu. nullglob nebude fungovať, pretože konvertuje reťazec so zástupnými znakmi, ktorý nenašiel zhodu, na prázdny reťazec (nulová dĺžka), ktorý pre cp spôsobí chybu.

Ak sa však v priečinku nachádzajú tisíce súborov alebo viac, potom by sa prístup so zástupnými znakmi mal úplne opustiť. Faktom je, že bash rozšíri zástupné znaky na veľmi dlhý príkazový riadok, ako napríklad:

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

Existuje obmedzenie dĺžky príkazového riadku, ktoré zistíme pomocou príkazu:

getconf ARG_MAX

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

2097152

Или:

xargs --show-limits

Dostaneme niečo ako:

….
Maximum length of command we could actually use: 2089314
….

Zaobídeme sa teda úplne bez zástupných znakov.

Len si píšme

cp -a /source /target

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

Ak však cieľový priečinok existuje, súbory sa skopírujú do priečinka /target/source.

Nemôžeme vždy vopred vymazať priečinok /target, pretože môže obsahovať súbory, ktoré potrebujeme, a naším cieľom je napríklad doplniť súbory v /target súbormi z /source.

Ak by sa zdrojový a cieľový priečinok nazývali rovnako, napríklad sme kopírovali z /source do /home/source, potom by sme mohli použiť príkaz:

cp -a /source /home

A po skopírovaní by sa súbory v /home/source doplnili o súbory z /source.

Toto je logický problém: môžeme pridať súbory do cieľového adresára, ak sú priečinky pomenované rovnako, ale ak sú odlišné, zdrojový priečinok sa umiestni do cieľa. Ako kopírovať súbory z / source do / target pomocou cp bez zástupných znakov?

Aby sme obišli toto škodlivé obmedzenie, používame neočividné riešenie:

cp -a /source/. /target

Tí, ktorí poznajú DOS a Linux, už pochopili všetko: v každom priečinku sú 2 neviditeľné priečinky „.“ a „..“, čo sú odkazy na pseudopriečinky na aktuálne a vyššie adresáre.

  • Pri kopírovaní cp skontroluje existenciu a pokúsi sa vytvoriť /cieľ/.
  • Takýto adresár existuje a je to /target
  • Súbory z /source sa skopírujú do /target správne.

Zaveste si ho teda v tučnom ráme na pamiatku alebo na stenu:

cp -a /source/. /target

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

Závery

Ak potrebujete skopírovať všetko súbory z jedného priečinka do druhého, nepoužívame zástupné znaky, je lepšie použiť ich cp v kombinácii s bodkou na konci zdrojového priečinka. Tým sa skopírujú všetky súbory, vrátane skrytých, a nezlyhá to ani s miliónmi súborov alebo so žiadnymi súbormi.

Doslov

vmspike navrhol verziu príkazu s podobným výsledkom:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

POZNÁMKA: písmeno T má význam. Ak to pomiešate, dostanete úplný odpad: zmení sa smer kopírovania.
Vďaka:

  • spoločnosť RUVDS.COM za podporu a možnosť publikovať na svojom blogu na Habré.
  • Za obrázok Trojitý koncept. Obrázok je veľmi veľký a detailný, dá sa otvoriť v samostatnom okne.

PS Prípadné chyby, ktoré si všimnete, pošlite do súkromnej správy. Zvyšujem si za to karmu.

príkaz cp: správne skopírujte priečinky súborov do *nix

Zdroj: hab.com

Pridať komentár