statReturns a 13-element list giving the status info for a file, eitherthe file opened via FILEHANDLE or DIRHANDLE, or named by EXPR. If EXPR is omitted, it stats $_
(not _
!). Returns the empty list if stat
fails. Typicallyused as follows:
- ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
- $atime,$mtime,$ctime,$blksize,$blocks)
- = stat($filename);
Not all fields are supported on all filesystem types. Here are themeanings of the fields:
- 0 dev device number of filesystem
- 1 ino inode number
- 2 mode file mode (type and permissions)
- 3 nlink number of (hard) links to the file
- 4 uid numeric user ID of file's owner
- 5 gid numeric group ID of file's owner
- 6 rdev the device identifier (special files only)
- 7 size total size of file, in bytes
- 8 atime last access time in seconds since the epoch
- 9 mtime last modify time in seconds since the epoch
- 10 ctime inode change time in seconds since the epoch (*)
- 11 blksize preferred block size for file system I/O
- 12 blocks actual number of blocks allocated
(The epoch was at 00:00 January 1, 1970 GMT.)
(*) Not all fields are supported on all filesystem types. Notably, thectime field is non-portable. In particular, you cannot expect it to be a"creation time"; see Files and Filesystems in perlport for details.
If stat
is passed the special filehandle consisting of an underline, nostat is done, but the current contents of the stat structure from thelast stat
, lstat
, or filetest are returned. Example:
- if (-x $file && (($d) = stat(_)) && $d < 0) {
- print "$file is executable NFS file\n";
- }
(This works on machines only for which the device number is negativeunder NFS.)
Because the mode contains both the file type and its permissions, youshould mask off the file type portion and (s)printf using a "%o"
if you want to see the real permissions.
- $mode = (stat($filename))[2];
- printf "Permissions are %04o\n", $mode & 07777;
In scalar context, stat
returns a boolean value indicating successor failure, and, if successful, sets the information associated withthe special filehandle _
.
The File::stat module provides a convenient, by-name access mechanism:
- use File::stat;
- $sb = stat($filename);
- printf "File is %s, size is %s, perm %04o, mtime %s\n",
- $filename, $sb->size, $sb->mode & 07777,
- scalar localtime $sb->mtime;
You can import symbolic mode constants (S_IF*
) and functions(S_IS*
) from the Fcntl module:
- use Fcntl ':mode';
- $mode = (stat($filename))[2];
- $user_rwx = ($mode & S_IRWXU) >> 6;
- $group_read = ($mode & S_IRGRP) >> 3;
- $other_execute = $mode & S_IXOTH;
- printf "Permissions are %04o\n", S_IMODE($mode), "\n";
- $is_setuid = $mode & S_ISUID;
- $is_directory = S_ISDIR($mode);
You could write the last two using the -u
and -d
operators.Commonly available S_IF*
constants are:
- # Permissions: read, write, execute, for user, group, others.
- S_IRWXU S_IRUSR S_IWUSR S_IXUSR
- S_IRWXG S_IRGRP S_IWGRP S_IXGRP
- S_IRWXO S_IROTH S_IWOTH S_IXOTH
- # Setuid/Setgid/Stickiness/SaveText.
- # Note that the exact meaning of these is system-dependent.
- S_ISUID S_ISGID S_ISVTX S_ISTXT
- # File types. Not all are necessarily available on
- # your system.
- S_IFREG S_IFDIR S_IFLNK S_IFBLK S_IFCHR
- S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
- # The following are compatibility aliases for S_IRUSR,
- # S_IWUSR, and S_IXUSR.
- S_IREAD S_IWRITE S_IEXEC
and the S_IF*
functions are
- S_IMODE($mode) the part of $mode containing the permission
- bits and the setuid/setgid/sticky bits
- S_IFMT($mode) the part of $mode containing the file type
- which can be bit-anded with (for example)
- S_IFREG or with the following functions
- # The operators -f, -d, -l, -b, -c, -p, and -S.
- S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode)
- S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode)
- # No direct -X operator counterpart, but for the first one
- # the -g operator is often equivalent. The ENFMT stands for
- # record flocking enforcement, a platform-dependent feature.
- S_ISENFMT($mode) S_ISWHT($mode)
See your native chmod(2) and stat(2) documentation for more detailsabout the S_*
constants. To get status info for a symbolic linkinstead of the target file behind the link, use the lstat
function.
Portability issues: stat in perlport.