---
name: "File::Find"
section: "3pm"
platform: "linux"
package: "perl-5.004-doc"
version: "5.004.05-6"
release: "Debian 2.2 (Potato)"
platforms: ["linux"]
url: "https://new.carta.tech/File::Find/3pm"
---

# File::Find(3pm)

traverse a file tree finddepth - traverse a directory structure depth-first

## NAME

find - traverse a file tree

finddepth - traverse a directory structure depth-first

## SYNOPSIS

```
    use File::Find;
    find(\&wanted, '/foo','/bar');
    sub wanted { ... }
```

```
    use File::Find;
    finddepth(\&wanted, '/foo','/bar');
    sub wanted { ... }
```

## DESCRIPTION

The first argument to *find()* is either a hash reference describing the operations to be performed for each file, a code reference, or a string that contains a subroutine name.  If it is a hash reference, then the value for the key `wanted` should be a code reference.  This code reference is called *the wanted() function* below.

Currently the only other supported key for the above hash is `bydepth`, in presense of which the walk over directories is performed depth-first.  Entry point *finddepth()* is a shortcut for specifying `{ bydepth =` 1}\> in the first argument of *find()*.

The *wanted()* function does whatever verifications you want. `$File::Find::dir` contains the current directory name, and `$_` the current filename within that directory.  `$File::Find::name` contains `"$File::Find::dir/$_"`.  You are *chdir()*'d to `$File::Find::dir` when the function is called.  The function may set `$File::Find::prune` to prune the tree.

File::Find assumes that you don't alter the `$_` variable.  If you do then make sure you return it to its original value before exiting your function.

This library is useful for the `find2perl` tool, which when fed,

```
    find2perl / -name .nfs\* -mtime +7 \
        -exec rm -f {} \; -o -fstype nfs -prune
```

produces something like:

```
    sub wanted {
        /^\.nfs.*$/ &&
        (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_)) &&
        int(-M _) > 7 &&
        unlink($_)
        ⎪⎪
        ($nlink ⎪⎪ (($dev,$ino,$mode,$nlink,$uid,$gid) = lstat($_))) &&
        $dev < 0 &&
        ($File::Find::prune = 1);
    }
```

Set the variable `$File::Find::dont_use_nlink` if you're using AFS, since AFS cheats.

`finddepth` is just like `find`, except that it does a depth-first search.

Here's another interesting wanted function.  It will find all symlinks that don't resolve:

```
    sub wanted {
        -l && !-e && print "bogus link: $File::Find::name\n";
    }
```

## BUGS

There is no way to make find or finddepth follow symlinks.
