![]() |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
Test | Význam |
-e | soubor existuje |
-z | soubor existuje a je prázdný |
-s | vrací velikost souboru v bajtech |
-d | soubor je adresářem |
-l | soubor je symbolickým odkazem |
-f | soubor je "obyčejným" souborem (ne tedy adresářem apod.) |
-p | soubor je pojmenovanou rourou, nebo je rourou ovladač |
-S | soubor je socket |
-b | soubor je blokový soubor |
-c | soubor je znakový soubor |
-t | soubor je prostředkem tty (STDIN) |
-x | soubor je spustitelný |
-w | do souboru lze zapisovat |
-r | soubor lze číst |
-B | soubor je binární |
-T | soubor je textový |
-A | počet dní od posledního přístupu k souboru |
-M | počet dní od poslední změny souboru |
-C | počet dní od poslední změny i-uzlu |
-u | soubor má nastavený setuid bit |
-g | soubor má nastavený setgid bit |
-k | soubor má nastavený sticky bit |
Všechny testy přijímají argument v podobě názvu souboru nebo ovladače. Ten může a nemusí být uveden v závorkách.
-r "soubor";
-r("soubor");
Tyto operátory se téměř výhradně používají v podmínkových konstrukcích. Je to dáno mimo jiné tím, že kromě operátorů pro získávání časových údajů a operátoru -s, který vrací délku souboru, je má smysl používat pouze k testování pravda-nepravda.
Abychom si předvedli, jak se operátory používají, uvedeme si tři krátké úseky kódu. První a nejjednodušší bude vyšetřovat soubor a.out z hlediska práv.
$file = "a.out";
print "Soubor $file:\n";
print "Lze číst\n" if -r $file;
print "Lze zapisovat\n" if -w $file;
print "Lze spouštět\n" if -x $file;
print "Nastaven SUID\n" if -u $file;
print "Nastaven SGID\n" if -g $file;
print "Nastaven sticky\n" if -k $file;
Pokud si zkusíte skript spustit pod uživatelem s omezenými právy, změní se samozřejmě i výstup našeho programu.
Dále si demonstrujme ochranu před nechtěným přepsáním souboru.
$zaloha = "zaloha.bck";
if (-e "soubor"){
print "Soubor $zaloha již existuje! Přepsat? (a/n) ";
chomp($volba = <STDIN>);
if (lc $volba ne "a"){
die "Záloha nebyla provedena.\n";
}
}
open (ZALOHA, ">$zaloha") or die "Chyba: $!";
...
Soubor je otevřen pro zápis jen v případě, že test byl vyhodnocen jako false nebo pokud program dostal výslovný souhlas soubor přepsat.
Operátor -s získává velikost souboru v bajtech. Napíšeme program, který bude vypisovat velikost zadaného souboru, pokud půjde o obyčejný soubor. Využijeme také toho, že operátory pracují s výchozí proměnnou.
while(<STDIN>){
chomp;
next unless -f;
$velikost = -s;
print "$_ má ${velikost}B\n";
}
Fuknce stat, podobně jako stejnojmenný systémový příkaz, zpřístupňuje i-uzel. V něm jsou uloženy důležité informace o každém souboru. Parametrem funkce stat je ovladač nebo jméno souboru. Funkce vrací pole hodnot s následujícími informacemi o souboru.
Index | Název | Význam |
0 | dev | číslo zařízení souborového systému |
1 | ino | číslo i-uzlu |
2 | mode | mód souboru (typ a práva) v desítkovém zápisu |
3 | nlink | počet pevných odkazů na soubor |
4 | uid | uid vlastníka |
5 | gid | gid vlastníka (tedy id skupiny) |
6 | rdev | identifikátor zařízení (význam má jen u speciálních souborů. U obyčejných vrací 0) |
7 | size | velikost souboru v bajtech |
8 | atime | čas posledního přístupu k souboru |
9 | mtime | čas poslední změny souboru |
10 | ctime | čas poslední změny i-uzlu |
11 | blksize | velikost bloku |
12 | blocks | počet alokovaných bloků |
Pokud chceme informace o symbolickém odkazu, použijeme lstat.
S využitím hodnoty mtime a funkce localtime, která čas poslední změny souboru převede do srozumitelného formátu, napíšeme program, který vypisuje datum a čas poslední změny souboru. Fungovat bude prakticky stejně jako náš program na zjišťování velikostí souborů, jen bude vypisovat jinou informaci.
while(<STDIN>){
chomp;
next unless -e;
$mtime = (stat)[9];
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($mtime);
$datum = sprintf("%02d.%02d.%4d", $mday, $mon, $year+1900);
$cas = sprintf("%02d:%02d:%02d", $sec, $min, $hour);
print "Posledni zmena souboru je z $datum, $cas\n";
}
Příkaz fileno vrací deskriptor ovladače. To je nějaké číslo, které je pro shodné ovladače stejné. Používá se právě k testování shodnosti ovladačů.
open(IN, "<-") or die "Chyba: $!";
open(OUT, ">-") or die "Chyba: $!";
print fileno IN; #0
print fileno OUT; #1
print fileno STDIN;#0
if (fileno IN == fileno STDIN){
print "Ovladač IN směřuje na standartní vstup";
}
Příští díl bude poslední k tématu práce se soubory. Zaměří se na jiné druhy souborů než obyčejné textové a navíc se podíváme na adresářovou rekurzi.
|
||
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5004x |
2. |
FreeBSD Download: 9214x |
3. |
PCLinuxOS-2010 Download: 8700x |
4. |
alcolix Download: 11096x |
5. |
Onebase Linux Download: 9809x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6372x |
1. |
xinetd Download: 2535x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5040x |
4. |
LinPacker Download: 10209x |
5. |
VFU File Manager Download: 3311x |
6. |
LeftHand Mała Księgowość Download: 7340x |
7. |
MISU pyFotoResize Download: 2973x |
8. |
Lefthand CRM Download: 3673x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3270x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |