Perl provides a number of operators to test for the class, condition, and state of files. These are unary operators that take a file name or file handle as an operand and usually return a boolean value (unless the operator checks the age or size of a file, for example). A file test expression takes the form
operator file_name/file_handle
Typical operations with file tests check if a file's existence, its size, its age, or operations on all files of a certain kind.
Common File Test Operators | |
---|---|
-e | File exists. |
-d | File is a directory. |
-f | File is plain file (not a directory, link, etc.). |
-T | File is text file. |
-B | File is binary file (not a text file). |
-r | File is readable by owner/group of running script. |
-w | File is writable by owner/group of running script. |
-s | Size of file. |
-M | Days since last modification of file. |
Assuming that the following items are located in directory 'test' (output from 'ls ./test
'),
19.J29TB1.SA2O.var new_directory test.jpg test.xls colors.html test.doc test.txt
the script,
# script file_test.pl # program opens a directory, reads it, and prints # the content to STDOUT # first, create a variable that holds the path to the directory $dir = "./test"; # we assume directory is a subdirectory # of the current working directory # second, create a directory handle named 'DIR': # directory handles are created with the opendir() function; # the first parameter is the name of the handle, # the second is the path and name of the directory opendir(DIR, $dir); # get input from DIR @content = readdir(DIR); # assign a list of the content to var # process the directory content foreach $entry (@content) { $entry = "$dir/$entry"; if (-d $entry ) # test if it is a directory { print $entry . " is a directory\n"; } elsif (-f $entry ) # test if it is a file { print $entry . " is a "; if (-T $entry ) # test if it is a text file { print "text file,"; } elsif (-B $entry ) # test if it is a binary file { print "binary file,"; } else { print "file of unknown format,"; } print " ". (-s $entry) . " bytes\n"; # get the file size } } print "\n"; closedir(DIR); # for good measure
would create the following output:
./test/19.J29TB1.SA2O.var is a text file, 200 bytes ./test/colors.html is a text file, 51586 bytes ./test/new_directory is a directory ./test/test.doc is a binary file, 19456 bytes ./test/test.jpg is a binary file, 38637 bytes ./test/test.txt is a text file, 14 bytes ./test/test.xls is a binary file, 7168 bytes