# stat - perldoc - phpman

> **TLDR:** Display file and filesystem information.
>
- Display properties about a specific file such as size, permissions, creation date, and access date among others:
  `stat {{path/to/file}}`
- Display properties about a specific file, only showing the raw result data without labels:
  `stat {{-t|--terse}} {{path/to/file}}`
- Display information about the filesystem where a specific file is located:
  `stat {{-f|--file-system}} {{path/to/file}}`
- Show only octal file permissions:
  `stat {{-c|--format}} "%a %n" {{path/to/file}}`
- Show the owner and group of a specific file:
  `stat {{-c|--format}} "%U %G" {{path/to/file}}`
- Show the size of a specific file in bytes:
  `stat {{-c|--format}} "%s %n" {{path/to/file}}`

*Source: tldr-pages*

---

    stat FILEHANDLE
    stat EXPR
    stat DIRHANDLE
    stat    Returns a 13-element list giving the status info for a file,
            either the file opened via FILEHANDLE or DIRHANDLE, or named by
            EXPR. If EXPR is omitted, it stats $_ (not "_"!). Returns the
            empty list if "stat" fails. Typically used as follows:

                my ($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
            the meanings 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 I/O size in bytes for interacting with the
                         file (may vary from file to file)
             12 blocks   actual number of system-specific blocks allocated
                         on disk (often, but not always, 512 bytes each)

            (The epoch was at 00:00 January 1, 1970 GMT.)

            (*) Not all fields are supported on all filesystem types.
            Notably, the ctime 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, no stat is done, but the current contents of the stat
            structure from the last "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
            negative under NFS.)

            On some platforms inode numbers are of a type larger than perl
            knows how to handle as integer numerical values. If necessary,
            an inode number will be returned as a decimal string in order to
            preserve the entire value. If used in a numeric context, this
            will be converted to a floating-point numerical value, with
            rounding, a fate that is best avoided. Therefore, you should
            prefer to compare inode numbers using "eq" rather than "==".
            "eq" will work fine on inode numbers that are represented
            numerically, as well as those represented as strings.

            Because the mode contains both the file type and its
            permissions, you should mask off the file type portion and
            (s)printf using a "%o" if you want to see the real permissions.

                my $mode = (stat($filename))[2];
                printf "Permissions are %04o\n", $mode & 07777;

            In scalar context, "stat" returns a boolean value indicating
            success or failure, and, if successful, sets the information
            associated with the special filehandle "_".

            The [File::stat](https://www.chedong.com/phpMan.php/perldoc/File%3A%3Astat/markdown) module provides a convenient, by-name access
            mechanism:

                use [File::stat](https://www.chedong.com/phpMan.php/perldoc/File%3A%3Astat/markdown);
                my $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';

                my $mode = (stat($filename))[2];

                my $user_rwx      = ($mode & S_IRWXU) >> 6;
                my $group_read    = ($mode & S_IRGRP) >> 3;
                my $other_execute =  $mode & S_IXOTH;

                printf "Permissions are %04o\n", S_IMODE($mode), "\n";

                my $is_setuid     =  $mode & S_ISUID;
                my $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)](https://www.chedong.com/phpMan.php/man/chmod/2/markdown) and [stat(2)](https://www.chedong.com/phpMan.php/man/stat/2/markdown) documentation for more
            details about the "S_*" constants. To get status info for a
            symbolic link instead of the target file behind the link, use
            the "lstat" function.

            Portability issues: "stat" in perlport.

