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: