[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: perl's stat and symlinks

On Sun, 15 Dec 2002, Colin Watson wrote:

> On Sun, Dec 15, 2002 at 05:31:15PM +0100, Michael Naumann wrote:
> > when I do from perl
> >   @f    = stat "f";
> >   @sl2f = stat "sl2f";
> > I always get the same contents in @sl2f as in @f, i.e stat follows the link.
> > Thus I cannot decide via stat,
> > whether the file in question is a symlink or a not.
> Use lstat().

Alternatively, use the file test operators. From man perlfunc:

       -X EXPR
       -X      A file test, where X is one of the letters listed
               below.  This unary operator takes one argument,
               either a filename or a filehandle, and tests the
               associated file to see if something is true about
               it.  If the argument is omitted, tests "$_",
               except for "-t", which tests STDIN.  Unless other­
               wise documented, it returns "1" for true and "''"
               for false, or the undefined value if the file
               doesn't exist.  Despite the funny names, prece­
               dence is the same as any other named unary opera­
               tor, and the argument may be parenthesized like
               any other unary operator.  The operator may be any

                   -r  File is readable by effective uid/gid.
                   -w  File is writable by effective uid/gid.
                   -x  File is executable by effective uid/gid.
                   -o  File is owned by effective uid.

                   -R  File is readable by real uid/gid.
                   -W  File is writable by real uid/gid.
                   -X  File is executable by real uid/gid.
                   -O  File is owned by real uid.

                   -e  File exists.
                   -z  File has zero size (is empty).
                   -s  File has nonzero size (returns size in bytes).

                   -f  File is a plain file.
                   -d  File is a directory.
                   -l  File is a symbolic link.
                   -p  File is a named pipe (FIFO), or Filehandle is a
                   -S  File is a socket.
                   -b  File is a block special file.
                   -c  File is a character special file.
                   -t  Filehandle is opened to a tty.

                   -u  File has setuid bit set.
                   -g  File has setgid bit set.
                   -k  File has sticky bit set.

                   -T  File is an ASCII text file.
                   -B  File is a "binary" file (opposite of -T).

                   -M  Age of file in days when script started.
                   -A  Same for access time.
                   -C  Same for inode change time.

Andrew J Perrin - http://www.unc.edu/~aperrin
Assistant Professor of Sociology, U of North Carolina, Chapel Hill
clists@perrin.socsci.unc.edu * andrew_perrin (at) unc.edu

Reply to: