Namhlanje sifuna ukuthetha malunga nohlaziyo lwamva nje lwenkqubo yeSherlock [le liqela elisebenza kakhulu kwiYunivesithi yaseStanford - malunga. trans.], ekhawulezisa ngokuphawulekayo ukudwelisa iifayile kubalawuli abanenani elikhulu lamangeno.
Ngokungafaniyo namanqaku aqhelekileyo, le yingxelo yangaphakathi malunga nendlela esisebenza ngayo rhoqo kwi-Sherlock ukuyigcina isebenza ngokugqibeleleyo kubasebenzisi bethu. Sinethemba lokupapasha amanqaku amaninzi anjengala kwixesha elizayo.
Ukudwelisa iifayile ezininzi kuthatha ixesha
Yonke yaqala ngombuzo wenkxaso yobugcisa obuvela kumsebenzisi. Wachaza ingxaki ukuba ukubulawa ls
kuthatha imizuzu embalwa kuluhlu olunongeniso olungaphezulu kwe-15 $SCRATCH
[uluhlu lweefayile zethutyana - malunga. indlela].
Amawaka eefayile kulawulo olunye adla ngokubeka umthwalo kwisixokelelwano sefayile kwaye ngokuqinisekileyo ayikhuthazwa. Umsebenzisi uyayazi le nto kwaye wavuma ukuba ayilunganga, kodwa ukhankanye ukuba uluhlu lwamaxesha angama-1000 ngokukhawuleza kwilaptop yakhe kuneSherlock. Kakade ke, oku kwasikhathaza. Ngoko sajonga nzulu.
Kuba ibukeka intle.
Siye sajonga into eyenzayo ngokwenene ls
xa udwelisa uvimba weefayili, kwaye kutheni inkqubo ithatha ixesha elide kangaka. Kuninzi lwangoku losasazo ls
ngokungagqibekanga isebenza njenge ls --color=auto
, kuba wonke umntu uyayithanda imibala.
Kodwa imibala emihle iza ngexabiso: kuyo yonke ifayile ls
kufuneka bafumane ulwazi malunga nodidi lwefayile, iimvume zayo, iiflegi, iimpawu ezongeziweyo kunye nezinto ezinjalo ukuze ukhethe umbala ofanelekileyo.
Isisombululo esinye esilula kwingxaki kukukhubaza umbala kwi-ls ngokupheleleyo, kodwa khawucinge ukucaphuka kwabasebenzisi. Ngaphantsi kweemeko akufanele uthabathe imveliso yombala, asikho izilo.
Ngoko sajonga nzulu. ls
amangeno anemibala ngemeko-bume eguquguqukayo LS_COLORS
, ebekiweyo dircolors(1)
ngokusekelwe kwifayile yoqwalaselo dir_colors(5)
... Ewe,
Makhe sihlolisise
Ukumisela ukuba loluphi udweliso lombala olubangela ukucotha, senze imeko yovavanyo:
$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000
real 0m12.758s
user 0m0.104s
sys 0m0.699s
Imizuzwana eyi-12,7 yeefayile eziyi-10, ayilunganga kakhulu.
Ngendlela, sifuna iflegi
--color=always
: nangona ejika kuyels --color=auto
kodwals
ibhaqa xa ingaqhagamshelwanga kwi-terminal (umzekelo. ngombhobho okanye ngolawulo ngokutsha lwemveliso) kwaye ivale umbala ukuba imiselweauto
. Indoda ekrelekrele.
Yintoni ke le ithatha ixesha elide kangaka? Sajonga kunye strace
:
$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
44.21 0.186617 19 10000 lstat
42.60 0.179807 18 10000 10000 getxattr
12.19 0.051438 5 10000 capget
0.71 0.003002 38 80 getdents
0.07 0.000305 10 30 mmap
0.05 0.000217 12 18 mprotect
0.03 0.000135 14 10 read
0.03 0.000123 11 11 open
0.02 0.000082 6 14 close
[...]
Wow: 10 iminxeba lstat()
, 10 iminxeba getxattr()
(ezo zisilelayo zonke kuba indawo yethu ayinazo iimpawu ls ikhangelayo), 10 iminxeba capget()
.
Ngokuqinisekileyo oku kunokwandiswa.
Uphawu lwezakhono? Hayi
Ukulandela icebiso
$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
98.95 0.423443 42 10000 lstat
0.78 0.003353 42 80 getdents
0.04 0.000188 10 18 mprotect
0.04 0.000181 6 30 mmap
0.02 0.000085 9 10 read
0.02 0.000084 28 3 mremap
0.02 0.000077 7 11 open
0.02 0.000066 5 14 close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.427920 10221 6 total
real 0m8.160s
user 0m0.115s
sys 0m0.961s
Wowu, ukuya kuthi ga kwimizuzwana eyi-8 yesantya! Sahlukana nazo zonke ezo fowni zidurayo getxattr()
, kunye nemingeni capget()
yanyamalala nayo, kakhulu.
Kodwa kusekho le minxeba ikruqulayo lstat()
, Nangona njeβ¦
Zingaphi iintyatyambo ozifunayo?
Ngoko ke, sihlolisise ngakumbi LS_COLORS
.
Okokuqala, sivele sikhubaze oku kuguquguquka:
$ echo $LS_COLORS rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36: $ unset LS_COLORS $ echo $LS_COLORS $ time ls --color=always $SCRATCH/dont | wc -l 10000 real 0m13.037s user 0m0.077s sys 0m1.092s
Intoni!?! Isekho imizuzwana eyi-13?
Kuvela ukuba xa imo engqongileyo iyaguquguquka LS_COLORS
inye kuphela ielementi yayo engachazwanga okanye engekhoyo <type>=color:
, isebenzisa isiseko sedatha esakhelwe-ngaphakathi ngokungagqibekanga kwaye isasebenzisa imibala. Ke ukuba ufuna ukukhubaza ukufakwa kombala kuhlobo oluthile lwefayile, kufuneka ubhale ngaphezulu ngayo <type>=:
okanye <type> 00
kwifayile DIR_COLORS
.
Emva kovavanyo oluninzi kunye neempazamo, sicuthe uphendlo lwethu ukuya koku:
EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00
ebhalwe njenge
LS_COLORS='ex=00:su=00:sg=00:ca=00:'
Oku kuthetha: musa ukufaka umbala kwiifayile ngophawu loyelelwano.
, hayi nge
Sikhawuleza ls
Kwaye ukuba awukwenzi nayiphi na kwezi zitsheki, ke iminxeba lstat()
inyamalala, kwaye ngoku yinto eyahlukileyo ngokupheleleyo:
$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
63.02 0.002865 36 80 getdents
8.10 0.000368 12 30 mmap
5.72 0.000260 14 18 mprotect
3.72 0.000169 15 11 open
2.79 0.000127 13 10 read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00 0.004546 221 6 total
real 0m0.337s
user 0m0.032s
sys 0m0.029s
0,3 imizuzwana kuluhlu lweefayile ze-10, irekhodi.
Ukumisela i-Sherlock
Imizuzwana eyi-13 ngoseto olungagqibekanga ukuya kwimizuzwana eyi-0,3 ngokulungiswa okuncinci LS_COLORS
kuthetha ukukhawuleza kwe-40 ngenxa yokungabikho setuid
/ setgid
kunye neefayile ezisebenzisekayo ezinemibala. Hayi ilahleko enkulu kangaka.
Ewe kunjalo, oku kuqwalaselwe kwiSherlock kumsebenzisi ngamnye.
Kodwa ukuba ufuna ukubuyisela umbala, unokubuyela ngokulula kuseto olungagqibekanga:
$ unset LS_COLORS
Kodwa ke kubalawuli abaneefayile ezininzi, qiniseka ukwenza ikofu ngelixa isebenza ls
.
umthombo: www.habr.com