Ĉ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: