Как да използвате командата stat в Linux

Командата на Linux stat ви показва много повече подробности, отколкото ls. Надникнете зад завесата с тази информативна и конфигурируема програма. Ще ви покажем как да го използвате.

stat ви отвежда зад кулисите

Командата ls е страхотна в това, което прави — и прави много — но с Linux изглежда, че винаги има начин да отидете по-дълбоко и да видите какво се крие под повърхността. И често това не е просто случай на повдигане на ръба на килима. Можете да разкъсате подовите дъски и след това да изкопаете дупка. Можете да обелите Linux като лук.

ls ще ви покаже голяма част от информацията за даден файл, като например кои разрешения са зададени за него и колко е голям и дали е файл или символна връзка. За да покаже тази информация, ls я чете от a структура на файловата система, наречена inode.

Всеки файл и директория има inode. Инодът държи метаданни за файла, като например блоковете на файловата система, които заема, и печатите за дата, свързани с файла. Inode е като библиотечна карта за файла. Но ls ще ви покаже само част от информацията. За да видим всичко, трябва да използваме командата stat.

Подобно на ls, командата stat има много опции. Това го прави чудесен кандидат за използване на псевдоними. След като откриете определен набор от опции, които карат stat да ви даде желания резултат, увийте го в псевдоним или функция на обвивката. Това го прави много по-удобно за използване и не е нужно да помните тайнствен набор от опции на командния ред.

Бързо сравнение

Нека използваме ls, за да ни предоставим дълъг списък (опция -l) с размери на файлове, които могат да се четат от човека (опция -h):

ls -lh ana.h

От ляво на дясно информацията, която ls предоставя е:

Първият знак е тире „-“ и това ни казва, че файлът е обикновен файл, а не сокет, символна връзка или друг тип обект.
Собственикът, групата и другите разрешения са изброени в осмичен формат.
Броят твърди връзки, сочещи към този файл. В този случай, а и в повечето случаи, той ще бъде един.
Собственикът на файла е Дейв.
Собственикът на групата е Дейв.
Размерът на файла е 802 байта.
Файлът е последно променен в петък, 13 декември 2015 г.
Името на файла е ana.c.

Нека да разгледаме със статистика:

stat ana.h

Информацията, която получаваме от статистиката е:

Файл: Името на файла. Обикновено е същото като името, което сме предали на stat в командния ред, но може да е различно, ако гледаме символна връзка.
Размер: Размерът на файла в байтове.
Блокове: Броят на блоковете на файловата система, които файлът изисква, за да бъде съхранен на твърдия диск.
IO Block: Размерът на блок на файловата система.
Тип файл: Типът обект, който метаданните описват. Най-често срещаните типове са файлове и директории, но те могат да бъдат и връзки, сокети или именувани канали.
Устройство: Номерът на устройството в шестнадесетичен и десетична. Това е идентификационният номер на твърдия диск, на който се съхранява файлът.
Inode: Номерът на inode. Тоест идентификационният номер на този inode. Заедно номерът на inode и номерът на устройството уникално идентифицират файл.
Връзки: Това число показва колко твърди връзки сочат към този файл. Всяка твърда връзка има свой собствен inode. Така че друг начин да мислим за тази цифра е колко inode сочат към този един файл. Всеки път, когато се създаде или изтрие твърда връзка, този номер ще се коригира нагоре или надолу. Когато достигне нула, самият файл е изтрит и inode се премахва. Ако използвате stat в директория, това число представлява броя на файловете в директорията, включително „.“ запис за текущата директория и записът “..” за родителската директория.
Достъп: Разрешенията за файлове са показани в техните осмични и традиционни rwx (формати за четене, запис, изпълнение).
Uid: Потребителско име и име на акаунта на собственика.
Gid: ID на групата и името на акаунта на собственика.
Достъп: клеймото за време за достъп. Не толкова просто, колкото може да изглежда. Съвременните Linux дистрибуции използват схема, наречена relatime, която се опитва оптимизирайте записите на твърдия диск, необходими за актуализиране на времето за достъп. Просто казано, времето за достъп се актуализира, ако е по-старо от модифицираното време.
Промяна: клеймото за време на модификацията. Това е времето, когато съдържанието на файла е последно променено. (За късмет съдържанието на този файл последно е променено преди четири години към деня.)
Промяна: клеймото за време за промяна. Това е времето, когато атрибутите или съдържанието на файла са били последно променени. Ако модифицирате файл, като зададете нови разрешения за файл, клеймото за време за промяна ще бъде актуализирано (тъй като атрибутите на файла са се променили), но модифицираният времеви печат няма да бъде актуализиран (тъй като съдържанието на файла не е променено).
Раждане: Запазено за показване на оригиналната дата на създаване на файла, но това не се прилага в Linux.

  Как да използвате командата uniq в Linux

Разбиране на Timestamps

Времевите марки са чувствителни към часовата зона. -0500 в края на всеки ред показва, че този файл е създаден на компютър в a Координирано универсално време (UTC) часова зона, която е пет часа по-напред от часовата зона на текущия компютър. Така че този компютър изостава пет часа от компютъра, който е създал този файл. Всъщност файлът е създаден на компютър с часови зони в Обединеното кралство и ние го разглеждаме тук на компютър в часова зона на САЩ Eastern Standard.

Времевите марки за модифициране и промяна могат да причинят объркване, защото за непосветените имената им звучат така, сякаш означават едно и също нещо.

Нека използваме chmod, за да променим разрешенията за файл на файл, наречен ana.c. Ще го направим достъпен за запис от всички. Това няма да засегне съдържанието на файла, но ще засегне атрибутите на файла.

chmod +w ana.c

И тогава ще използваме stat, за да разгледаме времевите марки:

stat ana.c

Времевата марка за промяна е актуализирана, но модифицираната не е.

Промененото времеви печат ще се актуализира само ако съдържанието на файла се промени. Времевата марка за промяна се актуализира както за промени в съдържанието, така и за промени в атрибутите.

Използване на Stat с множество файлове

За да имате отчет за stat за няколко файла наведнъж, предайте имената на файловете на stat в командния ред:

stat ana.h ana.o

За да използвате статистика за набор от файлове, използвайте съвпадение на шаблони. Въпросителният знак „?“ представлява всеки единичен знак, а звездичката „*“ представлява всеки низ от знаци. Можем да кажем на stat да докладва за всеки файл, наречен „ana“ с разширение с една буква, с тази команда:

stat ana.?

Използване на stat за отчитане на файлови системи

stat може да докладва за състоянието на файловите системи, както и за състоянието на файловете. Опцията -f (файлова система) казва на stat да докладва за файловата система, на която се намира файлът. Забележете, че можем също да предадем директория като “/” на stat вместо име на файл.

stat -f ana.c

Информацията, която ни дава статистиката е:

  Как да свържете Facebook Messenger към Discord на Linux

Файл: Името на файла.
ID: Идентификаторът на файловата система в шестнадесетична нотация.
Namelen: Максимално допустимата дължина за имена на файлове.
Тип: Типът на файловата система.
Размер на блока: Количеството данни за заявки за четене за оптимални скорости на трансфер на данни.
Основен размер на блока: Размерът на всеки блок на файловата система.

блокове:

Общо: Общият брой на всички блокове във файловата система.
Безплатно: Броят на свободните блокове във файловата система.
Налично: Броят безплатни блокове, достъпни за обикновени (не-root) потребители.

иноди:

Общо: Общият брой inodes във файловата система.
Безплатно: Броят на свободните inode във файловата система.

Дерефериране на символни връзки

Ако използвате stat за файл, който всъщност е символна връзка, той ще докладва за връзката. Ако искате stat да докладва за файла, към който сочи връзката, използвайте опцията -L (dereference). Файлът code.c е символна връзка към ana.c. Нека го разгледаме без опцията -L:

stat code.c

Името на файла показва code.c, сочещ към ( -> ) ana.c. Размерът на файла е само 11 байта. Няма блокове, посветени на съхраняването на тази връзка. Типът на файла е посочен като символна връзка.

Ясно е, че тук не разглеждаме действителния файл. Нека направим това отново и добавим опцията -L:

stat -L code.c

Това сега показва подробностите за файла за файла, към който сочи символната връзка. Но имайте предвид, че името на файла все още се дава като code.c. Това е името на връзката, а не на целевия файл. Това се случва, защото това е името, което сме предали на stat в командния ред.

The Terse Report

Опцията -t (кратко) кара stat да предостави съкратено обобщение:

stat -t ana.c

Не са дадени улики. За да го осмислите — докато не запомните последователността на полетата — трябва да препратите този изход към пълен изход за статистика.

Персонализирани изходни формати

По-добър начин да получите различен набор от данни от stat е да използвате персонализиран формат. Има дълъг списък от токени, наречени форматни последователности. Всеки от тях представлява елемент от данни. Изберете тези, които искате да включите в изхода и създайте низ за форматиране. Когато извикаме stat и му предадем низа за форматиране, изходът ще включва само елементите от данни, които поискахме.

Има различни набори от форматни последователности за файлове и файлови системи. Списъкът с файлове е:

%a: Правата за достъп в осмични.
%A: Правата на достъп в разбираема от човека форма (rwx).
%b: Броят на разпределените блокове.
%B: Размерът в байтове на всеки блок.
%d: Номерът на устройството в десетичен знак.
%D: Номерът на устройството в шестнадесетичен.
%f: Суровият режим в шестнадесетичен.
%F Типът на файла.
%g: ID на групата на собственика.
%G: Името на групата на собственика.
%h: Броят на твърдите връзки.
%i: Номерът на inode.
%m: Точката на монтиране.
%n: Името на файла.
%N: Името на файла в кавички, с дереферирано име на файл, ако е символна връзка.
%o: Подсказка за оптималния размер на I/O трансфер.
%s: Общият размер в байтове.
%t: Основният тип устройство в шестнадесетичен, за специални файлове за символни/блокови устройства.
%T: Незначителният тип устройство в шестнадесетичен, за специални файлове за символни/блокови устройства.
%u: Потребителският идентификатор на собственика.
%U: Потребителското име на собственика.
%w: Времето на раждане на файла, разбираемо от човека или тире „-“, ако е неизвестно.
%W: Времето на раждане на файла, секунди след епохата; 0, ако не е известно.
%x: Времето на последен достъп, разбираемо от човека.
%X: Времето на последния достъп, секунди след епохата.
%y: Времето на последната модификация на данните, четливо от човека.
%Y: Времето на последната промяна на данните, секунди след епохата.
%z: Времето на последната промяна на състоянието, четливо от човека.
%Z: Времето на последната промяна на състоянието, секунди след епохата.

  Как да изтриете файлове и директории в терминала на Linux

„Епохата“ е Unix епоха, което се проведе на 1970-01-01 00:00:00 +0000 (UTC).

За файловите системи форматните последователности са:

%a: Броят безплатни блокове, достъпни за обикновени (не-root) потребители.
%b: Общият брой блокове данни във файловата система.
%c: Общият брой inodes във файловата система.
%d: Броят на свободните inode във файловата система.
%f: Броят на свободните блокове във файловата система.
%i: Идентификаторът на файловата система в шестнадесетичен.
%l: Максималната дължина на имената на файловете.
%n: Името на файла.
%s: Размерът на блока (оптималния размер за писане).
%S: Размерът на блоковете на файловата система (за броя на блоковете).
%t: Типът на файловата система в шестнадесетичен.
%T: тип файлова система в четяща от човека форма.

Има две опции, които приемат низове от форматни последователности. Това са –format и –printf. Разликата между тях е –printf интерпретира Ескейп последователности в стил C като нов ред n и tab t , и не добавя автоматично символ за нов ред към своя изход.

Нека създадем низ за форматиране и да го предадем на stat. Форматните последователности, които ще използваме, са %n за име на файла, %s за размера на файла и %F за типа файл. Ще добавим n escape последователност в края на низа, за да сме сигурни, че всеки файл се обработва на нов ред. Нашият форматен низ изглежда така:

"File %n is %s bytes, and is a %Fn"

Ще предадем това на stat, използвайки опцията –printf. Ще помолим stat да докладва за файл, наречен code.c, и набор от файлове, които съответстват на ana.?. Това е пълната команда. Обърнете внимание на знака за равенство “=” между –printf и форматиращия низ:

stat --printf="File %n is %s bytes, and is a %Fn" code.c ana/ana.?

stat --printf=

Отчетът за всеки файл е посочен на нов ред, което поискахме. Името на файла, размерът на файла и типа на файла са предоставени за нас.

Персонализираните формати ви дават достъп до дори повече елементи от данни, отколкото са включени в стандартния статистически изход.

Контрол на фините зърна

Както можете да видите, има огромен обхват за извличане на конкретни елементи от данни, които представляват интерес за вас. Вероятно можете също да разберете защо препоръчваме използването на псевдоними за по-дългите и по-сложни заклинания.