Команда `stat` у Линук окружењу открива знатно више информација у поређењу са командом `ls`. Овај информативни алат, са могућношћу прилагођавања, омогућава вам да зађете у дубину система. У наставку ћемо демонстрирати како се користи.
Завирите у позадину са командом `stat`
Иако је `ls` ефикасна у својој функцији – а ради много тога – у свету Линукса увек постоји могућност да се зађе дубље и открије шта се крије испод површине. Често то не значи само подизање „ивице тепиха“, већ ископавање „рупе“ испод „поднох дасака“. Линукс се може анализирати слој по слој.
Команда `ls` пружа корисне податке о фајлу, као што су дозволе, величина, и да ли се ради о фајлу или симболичкој вези. Ове информације `ls` прикупља из структуре фајл система познате као иноде.
Сваки фајл и директоријум има свој иноде. Иноде чува метаподатке о фајлу, попут локација блокова у фајл систему и временских ознака. Иноде је попут „библиотечке картице“ за фајл. Међутим, `ls` приказује само део тих информација. За потпун преглед, користимо команду `stat`.
Слично као и `ls`, команда `stat` има бројне опције, што је чини идеалном за креирање алијаса. Када пронађете комбинацију опција која вам највише одговара, можете је претворити у алијас или функцију шела. Ово олакшава употребу и елиминише потребу памћења сложених скупова командних опција.
Кратко поређење
Погледајмо како `ls` приказује дугачку листу (опција `-l`) са величинама фајлова у читљивом формату (опција `-h`):
ls -lh ana.h
Са лева на десно, информације које `ls` приказује су:
Први карактер, цртица `-`, означава обичан фајл, а не утичницу, симболичку везу или неки други тип објекта.
Затим следе дозволе за власника, групу и остале кориснике, приказане у окталном формату.
Број тврдих веза ка фајлу, обично један у већини случајева.
Власник фајла, у овом случају Даве.
Група којој фајл припада, такође Даве.
Величина фајла, 802 бајта.
Датум и време последње измене фајла, петак, 13. децембар 2015.
Име фајла, `ana.c`.
Сада, погледајмо шта нам даје команда `stat`:
stat ana.h
Информације које добијамо од `stat` су:
Име фајла: Име фајла. Обично је идентично оном које смо проследили `stat` у командној линији, осим ако не гледамо симболичку везу.
Величина: Величина фајла у бајтовима.
Блокови: Број блокова у фајл систему које фајл користи.
ИО Блоцк: Величина блокова у фајл систему.
Тип датотеке: Тип објекта који метаподаци описују. Најчешћи су фајлови и директоријуми, али могу бити и симболичке везе, утичнице или именоване цеви.
Уређај: ИД уређаја, приказан у хексадецималном и децималном формату. Ово је ИД хард диска на којем је фајл сачуван.
Иноде: Број инода. То је ИД број овог инода. Заједно са бројем уређаја, јединствено идентификује фајл.
Везе: Број тврдих веза које упућују на овај фајл. Свака тврда веза има свој иноде. Другим речима, ово показује колико инода указује на исти фајл. Сваки пут када се креира или уклони тврда веза, овај број се повећава или смањује. Када достигне нулу, сам фајл се брише, а иноде се уклања. Ако користите `stat` на директоријуму, овај број представља број фајлова у директоријуму, укључујући `.` (тренутни директоријум) и `..` (родитељски директоријум).
Приступ: Дозволе фајла приказане у окталном и `rwx` формату (читање, писање, извршавање).
Уид: Кориснички ИД и име власника.
Гид: Групни ИД и име групе власника.
Приступ: Временска ознака приступа. Модерне Линук дистрибуције користе шему звану `relatime`, која настоји оптимизовати уписивање на хард диск приликом ажурирања времена приступа. Једноставно речено, време приступа се ажурира само ако је старије од времена модификације.
Измена: Временска ознака модификације. Ово је време када је садржај фајла последњи пут измењен (у овом случају, пре четири године).
Промена: Временска ознака промене. Ово је време када су атрибути или садржај фајла последњи пут измењени. Ако промените дозволе фајла, ознака промене ће бити ажурирана, али не и ознака модификације (јер се садржај фајла није променио).
Рођење: Резервисано за приказ оригиналног датума креирања фајла, али није имплементирано у Линук-у.
Разумевање временских ознака
Временске ознаке зависе од временске зоне. `-0500` на крају сваке линије показује да је фајл креиран на рачунару у Координисаном универзалном времену (УТЦ), пет сати испред временске зоне тренутног рачунара. То значи да је овај рачунар пет сати иза оног који је креирао фајл. У стварности, фајл је креиран на рачунару у Великој Британији, а ми га гледамо на рачунару у источној временској зони САД.
Временске ознаке модификације и промене могу бити збуњујуће, јер, на први поглед, њихова имена могу изгледати као да означавају исто.
Користимо команду `chmod` да променимо дозволе фајла `ana.c`, тако да га сви могу писати. Ово неће утицати на садржај фајла, већ на његове атрибуте:
chmod +w ana.c
Затим користимо `stat` да видимо временске ознаке:
stat ana.c
Временска ознака промене је ажурирана, док ознака модификације није.
Ознака модификације се ажурира само када се мења садржај фајла. Ознака промене се ажурира за промене садржаја и атрибута.
Коришћење `stat` са више фајлова
За извештај `stat` за више фајлова истовремено, проследите имена фајлова команди у командној линији:
stat ana.h ana.o
За употребу `stat` на групи фајлова, користите „wildcard“ карактере. Знак питања `?` представља било који један карактер, а звездица `*` представља било који низ карактера. Можемо затражити од `stat` да извештава о свим фајловима који се зову `ana` и имају екстензију од једног слова, користећи ову команду:
stat ana.?
Коришћење `stat` за извештавање о фајл системима
Команда `stat` може извештавати о статусу фајл система, као и о статусу фајлова. Опција `-f` (фајл систем) говори команди `stat` да извештава о фајл систему на којем се фајл налази. Можемо проследити и директоријум као што је `/` уместо имена фајла.
stat -f ana.c
Подаци које добијамо су:
Име фајла: Име фајла.
ИД: ИД фајл система у хексадецималном формату.
Намелен: Максимална дозвољена дужина имена фајла.
Тип: Тип фајл система.
Величина блока: Количина података за захтевање читања за оптималне брзине преноса.
Основна величина блока: Величина сваког блока фајл система.
Блокови:
Укупно: Укупан број свих блокова у фајл систему.
Слободно: Број слободних блокова у фајл систему.
Доступно: Број слободних блокова доступних обичним корисницима (који нису `root`).
Иноди:
Укупно: Укупан број инода у фајл систему.
Слободно: Број слободних инода у фајл систему.
Дереференцирање симболичких веза
Ако користите `stat` на фајлу који је заправо симболичка веза, извештаваће о самој вези. Ако желите да `stat` извештава о фајлу на који веза упућује, користите опцију `-L` (дереференцирање). Фајл `code.c` је симболичка веза ка `ana.c`. Погледајмо без опције `-L`:
stat code.c
Име фајла показује `code.c` који упућује на (`->`) `ana.c`. Величина фајла је само 11 бајтова. Нема блокова посвећених чувању ове везе. Тип фајла је означен као симболичка веза.
Јасно је да овде не гледамо стварни фајл. Урадимо то поново са опцијом `-L`:
stat -L code.c
Ово сада приказује детаље фајла на који симболичка веза упућује. Међутим, запамтите да је име фајла и даље `code.c`, јер смо га тако проследили команди `stat`.
Сажети извештај
Опција `-t` (сажето) омогућава `stat` да прикаже сажет резиме:
stat -t ana.c
Нема наговештаја шта који податак представља. Да бисте разумели – осим ако не запамтите редослед поља – потребно је да овај излаз повежете са комплетним излазом `stat`.
Прилагођени формати излаза
Бољи начин за приказ прилагођеног скупа података из `stat` је употреба прилагођеног формата. Постоји дуга листа „токена“ званих формат секвенце. Свака од њих представља елемент података. Изаберите оне које желите да укључите у излаз и креирајте низ формата. Када позовемо `stat` и проследимо стринг формата, излаз ће садржати само оне елементе које смо тражили.
Постоје различити скупови формат секвенци за фајлове и фајл системе. Листа за фајлове је:
`%a`: Права приступа у окталном облику.
`%A`: Права приступа у људски читљивом формату (rwx).
`%b`: Број додељених блокова.
`%B`: Величина сваког блока у бајтовима.
`%d`: Децимални број уређаја.
`%D`: Број уређаја у хексадецималном формату.
`%f`: Необрађени режим у хексадецималном формату.
`%F`: Тип датотеке.
`%g`: ИД групе власника.
`%G`: Име групе власника.
`%h`: Број тврдих веза.
`%i`: Број инода.
`%m`: Тачка монтирања.
`%n`: Име датотеке.
`%N`: Име датотеке под наводницима, са дереференцираним именом ако је то симболичка веза.
`%o`: Савет за оптималну величину И/О преноса.
`%s`: Укупна величина, у бајтовима.
`%t`: Главни тип уређаја у хексадецималном формату, за специјалне карактерске/блок уређајске фајлове.
`%T`: Минорни тип уређаја у хексадецималном формату, за специјалне карактерске/блок уређајске фајлове.
`%u`: Кориснички ИД власника.
`%U`: Корисничко име власника.
`%v`: Време креирања фајла, читљиво или `-` ако није познато.
`%V`: Време креирања фајла, секунде од Епохе; 0 ако није познато.
`%x`: Време последњег приступа, читљиво.
`%X`: Време последњег приступа, секунде од Епохе.
`%y`: Време последње измене података, читљиво.
`%Y`: Време последње измене података, секунде од Епохе.
`%z`: Време последње промене статуса, читљиво.
`%Z`: Време последње промене статуса, секунде од Епохе.
„Епоха“ је Уник Епох, 1970-01-01 00:00:00 +0000 (УТЦ).
За фајл системе, формат секвенце су:
`%a`: Број слободних блокова доступних обичним корисницима (који нису `root`).
`%b`: Укупан број блокова података у фајл систему.
`%c`: Укупан број инода у фајл систему.
`%d`: Број слободних инода у фајл систему.
`%f`: Број слободних блокова у фајл систему.
`%i`: ИД фајл система у хексадецималном формату.
`%l`: Максимална дужина имена фајла.
`%n`: Име фајла.
`%s`: Величина блока (оптимална величина за писање).
`%S`: Величина блокова фајл система (за број блокова).
`%t`: Тип фајл система у хексадецималном формату.
`%T`: Тип фајл система у читљивом формату.
Постоје две опције које прихватају низове формат секвенци: `–format` и `–printf`. Разлика између њих је што `–printf` интерпретира ескејп секвенце у Ц стилу, као што су нови ред `\n` и таб `\t`, и не додаје аутоматски нови ред у излаз.
Направимо стринг формата и проследимо га команди `stat`. Формат секвенце које ћемо користити су `%n` за име фајла, `%s` за величину фајла и `%F` за тип фајла. Додаћемо `\n` секвенцу на крају стринга да осигурамо да се сваки фајл обрађује у новом реду. Наш стринг формата изгледа овако:
"File %n is %s bytes, and is a %F\n"
Ово ћемо проследити команди `stat` користећи опцију `–printf`. Тражићемо од `stat` да извештава о фајлу `code.c` и групи фајлова који одговарају `ana.?`. Ово је комплетна команда. Обратите пажњу на знак једнакости `=` између `–printf` и стринга формата:
stat --printf="File %n is %s bytes, and is a %F\n" code.c ana/ana.?
Извештај за сваки фајл је приказан у новом реду, као што смо тражили. Имена фајлова, величине и типови су приказани.
Прилагођени формати вам дају приступ још већем броју елемената података него што је укључено у стандардни излаз команде `stat`.
Фина контрола
Као што видите, постоји широка могућност издвајања одређених елемената података који вас занимају. Вероватно такође можете разумети зашто смо препоручили коришћење алијаса за дуже и сложеније изразе.