|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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: 5525x |
| 2. |
FreeBSD Download: 9742x |
| 3. |
PCLinuxOS-2010 Download: 9231x |
| 4. |
alcolix Download: 11705x |
| 5. |
Onebase Linux Download: 10395x |
| 6. |
Novell Linux Desktop Download: 0x |
| 7. |
KateOS Download: 6894x |
| 1. |
xinetd Download: 3028x |
| 2. |
RDGS Download: 937x |
| 3. |
spkg Download: 5936x |
| 4. |
LinPacker Download: 11115x |
| 5. |
VFU File Manager Download: 3743x |
| 6. |
LeftHand Mała Księgowość Download: 7976x |
| 7. |
MISU pyFotoResize Download: 3456x |
| 8. |
Lefthand CRM Download: 4237x |
| 9. |
MetadataExtractor Download: 0x |
| 10. |
RCP100 Download: 3752x |
| 11. |
Predaj softveru Download: 0x |
| 12. |
MSH Free Autoresponder Download: 0x |
linuxsoft.cz | Design:
www.megadesign.cz