cp komandoa: fitxategi-karpetak zuzen kopiatzea *nix-en

cp komandoa: fitxategi-karpetak zuzen kopiatzea *nix-en

Artikulu honek erabilerarekin zerikusia duten gauza ez-agerikoak azalduko ditu komodinak kopiatzerakoan, komando-jokaera anbiguoa cp kopiatzerakoan, baita fitxategi kopuru handi bat behar bezala kopiatzeko aukera ematen duten metodoak ere, saltatu edo huts egin gabe.

Demagun /source karpetatik /target karpetara kopiatu behar dugula dena.

Burura datorkidan lehenengo gauza hau da:

cp /source/* /target

Zuzen dezagun berehala komando hau honela:

cp -a /source/* /target

gakoa -a atributu, eskubide guztien kopia gehituko du eta errekurtsioa gehituko du. Eskubideen erreprodukzio zehatza eskatzen ez denean, nahikoa da giltza bat -r.

Kopiatu ondoren, fitxategi guztiak ez zirela kopiatu ikusiko dugu, honelako puntu batekin hasten diren fitxategiak:

.profile
.local
.mc

eta antzekoak.

Zergatik gertatu da hau?

Komodinak shell-ak prozesatzen dituelako (bash kasu tipiko batean). Lehenespenez, bash-ek puntuz hasten diren fitxategi guztiak ez ikusi egingo ditu, ezkutuko gisa tratatzen baititu. Jokabide hori saihesteko portaera aldatu beharko dugu bash komandoa erabiliz:

shopt -s dotglob

Berrabiarazi ondoren portaera-aldaketa honek irauten duela ziurtatzeko, komodin.sh fitxategi bat sor dezakezu karpetan komando honekin. /etc/profile.d (Agian zure banaketak beste karpeta bat du).

Eta iturburu-direktorioan fitxategirik ez badago, shell-ak ezin izango du ezer ordezkatu izartxoaren ordez, eta kopiak ere huts egingo du errore batekin. Egoera honen aurka aukerak daude failglob ΠΈ nullglob. ezarri beharko dugu failglob, komandoa exekutatzea eragotziko duena. nullglob ez du funtzionatuko, bat-etortzerik aurkitu ez duten komodinak dituen kate bat kate huts batean bihurtzen baitu (zero luzera). cp errore bat eragingo du.

Hala ere, karpetan milaka fitxategi edo gehiago badaude, komodinen ikuspegia guztiz alde batera utzi beharko litzateke. Kontua da bash komodinak zabaltzen ditu komando-lerro luze batean:

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

Komando-lerroaren luzera muga bat dago, komandoa erabiliz aurki dezakeguna:

getconf ARG_MAX

Lor dezagun komando-lerroaren gehienezko luzera bytetan:

2097152

edo:

xargs --show-limits

Horrelako zerbait lortzen dugu:

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

Beraz, egin dezagun guztiz komodinik gabe.

Idatz dezagun

cp -a /source /target

Eta hemen portaeraren anbiguotasunaren aurrean gaude cp. /target karpeta existitzen ez bada, behar duguna lortuko dugu.

Hala ere, xede karpeta badago, fitxategiak /target/source karpetan kopiatuko dira.

Ezin dugu beti /target karpeta aldez aurretik ezabatu, behar ditugun fitxategiak izan ditzakeelako eta gure helburua, adibidez, /target-eko fitxategiak /source-ko fitxategiekin osatzea baita.

Iturburua eta helmuga karpetak berdin izendatuko balira, adibidez, /iturburutik /home/iturburura kopiatzen ari ginen, orduan komandoa erabil genezake:

cp -a /source /home

Eta kopiatu ondoren, /home/source-ko fitxategiak /source-ko fitxategiekin osatuko lirateke.

Hau arazo logikoa da: helmuga-direktorioan fitxategiak gehi ditzakegu karpetek izen bera badute, baina desberdinak badira, iturburu-karpeta helmugaren barruan kokatuko da. Nola kopiatu fitxategiak / source-tik / target-era cp erabiliz komodinik gabe?

Muga kaltegarri hau gainditzeko, argi ez den irtenbide bat erabiltzen dugu:

cp -a /source/. /target

DOS eta Linux ezagutzen dituztenek dena ulertu dute jada: karpeta bakoitzaren barruan 2 karpeta ikusezin daude "." eta β€œ..”, sasi-karpeten estekak dira uneko eta goi-mailako direktorioetara.

  • Kopiatzen denean cp existentzia egiaztatzen du eta /helmuga/ sortzen saiatzen da.
  • Halako direktorio bat existitzen da eta /target da
  • /source-tik fitxategiak /target-era behar bezala kopiatzen dira.

Beraz, zintzilikatu marko lodi batean zure memorian edo horman:

cp -a /source/. /target

Komando honen portaera argia da. Dena akatsik gabe funtzionatuko du, kontuan hartu gabe milioi bat fitxategi dituzun ala batere ez.

Findings

Kopiatu behar baduzu guztiak fitxategiak karpeta batetik bestera, ez ditugu komodinak erabiltzen, hobe da horien ordez erabiltzea cp iturburu-karpetaren amaierako puntu batekin konbinatuta. Honek fitxategi guztiak kopiatuko ditu, ezkutukoak barne, eta ez du huts egingo milioika fitxategirekin edo inolako fitxategirik gabe.

afterword

vmspike komandoaren bertsio bat iradoki du antzeko emaitzarekin:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

OHARRA: letra maiuskulak T esanahia du. Nahastuz gero, zabor osoa lortuko duzu: kopiatzeko norabidea aldatuko da.
Eskerrik asko:

  • konpainiak RUVDS.COM laguntzagatik eta HabrΓ©-n zure blogean argitaratzeko aukeragatik.
  • Irudi bakoitzeko Kontzeptu hirukoitza. Irudia oso handia eta zehatza da, beste leiho batean ireki daiteke.

PS Mesedez, bidali mezu pribatu batean nabarituko dituzun akatsak. Nire karma handitzen dut horretarako.

cp komandoa: fitxategi-karpetak zuzen kopiatzea *nix-en

Iturria: www.habr.com

Gehitu iruzkin berria