cp komando: ĝuste kopiante dosierujojn en *nix

cp komando: ĝuste kopiante dosierujojn en *nix

Ĉi tiu artikolo malkaŝos kelkajn ne-evidentajn aferojn rilatajn al la uzo de ĵokeroj dum kopiado, ambigua komanda konduto cp dum kopiado, same kiel metodoj kiuj permesas vin ĝuste kopii grandegan nombron da dosieroj sen salti aŭ kraŝi.

Ni diru, ke ni devas kopii ĉion el la /fonta dosierujo al la /cela dosierujo.

La unua afero, kiu venas al la menso, estas:

cp /source/* /target

Ni tuj korektu ĉi tiun komandon al:

cp -a /source/* /target

Ключ -a aldonos kopiadon de ĉiuj atributoj, rajtoj kaj aldonos rikurson. Kiam preciza reproduktado de rajtoj ne estas postulata, ŝlosilo sufiĉas -r.

Post kopiado, ni trovos, ke ne ĉiuj dosieroj estis kopiitaj - dosieroj komenciĝantaj per punkto kiel:

.profile
.local
.mc

kaj similaj.

Kial ĉi tio okazis?

Ĉar ĵokeroj estas procesitaj de la ŝelo (bash en tipa kazo). Defaŭlte, bash ignoros ĉiujn dosierojn komenciĝantajn per punktoj, ĉar ĝi traktas ilin kiel kaŝitajn. Por eviti ĉi tiun konduton ni devos ŝanĝi konduton bash uzante la komandon:

shopt -s dotglob

Por certigi, ke ĉi tiu kondutŝanĝo daŭras post rekomenco, vi povas krei wildcard.sh-dosieron kun ĉi tiu komando en la dosierujo. /etc/profile.d (Eble via distribuo havas alian dosierujon).

Kaj se ne estas dosieroj en la fonta dosierujo, tiam la ŝelo ne povos anstataŭigi ion ajn anstataŭ la asterisko, kaj kopiado ankaŭ malsukcesos kun eraro. Estas ebloj kontraŭ ĉi tiu situacio failglob и nullglob. Ni devos agordi failglob, kiu malhelpos la ekzekuton de la komando. nullglob ne funkcios, ĉar ĝi konvertas ĉenon kun ĵokeroj kiuj ne trovis kongruon en malplenan ĉenon (nullongo), kiu por cp kaŭzos eraron.

Tamen, se estas miloj da dosieroj aŭ pli en la dosierujo, tiam la aliro de ĵokeroj devas esti tute forlasita. La fakto estas tio bash vastigas ĵokerojn en tre longan komandlinion kiel:

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

Estas limo pri la longo de la komandlinio, kiun ni povas ekscii per la komando:

getconf ARG_MAX

Ni ricevu la maksimuman longon de la komandlinio en bajtoj:

2097152

Aŭ:

xargs --show-limits

Ni ricevas ion kiel:

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

Do, ni tute sen ĵokeroj.

Ni nur skribu

cp -a /source /target

Kaj ĉi tie ni estas antaŭ ambigueco de konduto cp. Se la /celdosierujo ne ekzistas, tiam ni ricevos tion, kion ni bezonas.

Tamen, se la cela dosierujo ekzistas, tiam la dosieroj estos kopiitaj al la /target/source dosierujo.

Ni ne povas ĉiam forigi la dosierujon /target anticipe, ĉar ĝi povas enhavi dosierojn, kiujn ni bezonas kaj nia celo, ekzemple, estas kompletigi la dosierojn en /target per dosieroj de /source.

Se la fontaj kaj celaj dosierujoj estis nomitaj same, ekzemple, ni kopiis de /source al /home/source, tiam ni povus uzi la komandon:

cp -a /source /home

Kaj post kopiado, la dosieroj en /home/source estus kompletigitaj per dosieroj de /source.

Ĉi tio estas logika problemo: ni povas aldoni dosierojn en la celdosierujon se la dosierujoj estas nomitaj same, sed se ili estas malsamaj, tiam la fonta dosierujo estos metita ene de la celo. Kiel kopii dosierojn de /source al /target uzante cp sen ĵokeroj?

Por ĉirkaŭiri ĉi tiun malutilan limigon, ni uzas ne-evidentan solvon:

cp -a /source/. /target

Tiuj, kiuj konas DOS kaj Linukso, jam ĉion komprenis: ene de ĉiu dosierujo estas 2 nevideblaj dosierujoj "." kaj "..", kiuj estas pseŭdo-dosierujoj ligiloj al la nunaj kaj pli altaj dosierujoj.

  • Dum kopiado cp kontrolas la ekziston kaj provas krei /celon/.
  • Tia dosierujo ekzistas kaj ĝi estas /target
  • Dosieroj de /source estas kopiitaj al /target ĝuste.

Do, pendigu ĝin en aŭdaca kadro en via memoro aŭ sur la muro:

cp -a /source/. /target

La konduto de ĉi tiu komando estas klara. Ĉio funkcios sen eraroj, sendepende de ĉu vi havas milionon da dosieroj aŭ tute neniun.

trovoj

Se vi bezonas kopii ĉiuj dosierojn de unu dosierujo al alia, ni ne uzas ĵokerojn, estas pli bone uzi ilin anstataŭe cp kombinita kun punkto ĉe la fino de la fonta dosierujo. Ĉi tio kopios ĉiujn dosierojn, inkluzive de kaŝitaj, kaj ne malsukcesos kun milionoj da dosieroj aŭ tute neniuj dosieroj.

Antaŭparolo

vmspike sugestis komandan version kun simila rezulto:

cp -a -T /source /target

Oz_Alex

cp -aT /source /target

NOTO: litermajusklo T havas la signifon. Se vi miksas ĝin, vi ricevos kompletan rubaĵon: la kopidirekto ŝanĝiĝos.
Dankon:

  • Kompanioj RUVDS.COM por subteno kaj la ŝanco publikigi en via blogo ĉe Habré.
  • Per bildo Triobla Koncepto. La bildo estas tre granda kaj detala, povas esti malfermita en aparta fenestro.

PS Bonvolu sendi iujn ajn erarojn, kiujn vi rimarkas en privata mesaĝo. Mi pliigas mian karmon por ĉi tio.

cp komando: ĝuste kopiante dosierujojn en *nix

fonto: www.habr.com

Aldoni komenton