The ubiquitous find command enables file searching across filesystem boundaries. However, sometimes we might want to exclude a certain filesystem from our search.
In this tutorial, we’ll explore ways to prevent find from searching for files in particular filesystems like the Network FileSystem (NFS) when performing recursive operations. First, we briefly refresh our knowledge about the structure of filesystems. Next, we talk about excluding certain mount points when searching with find. Finally, we discuss two options for avoiding most or particular filesystem types.
We tested the code in this tutorial on Debian 11 (Bullseye) with GNU Bash 5.1.4. It should work in most POSIX-compliant environments unless otherwise specified.
2. Filesystem Structure
Under Linux, / root is the starting point of the filesystem organizational structure as defined in the Filesystem Hierarchy Standard (FHS):
$ ls / bin initrd.img libx32 proc sys boot initrd.img.old lost+found root tmp dev lib media run usr etc lib32 mnt sbin var home lib64 opt srv vmlinuz
In fact, the specific / root filesystem is specified as a kernel parameter.
Further, we can use paths in that filesystem as mount points for others. Commonly, these reside under some default locations:
However, there are also systems with separate /tmp, /var, and other partitions. In fact, we can employ any accessible path as a mount point as long as it’s free.
To see a formatted list of mount points and their associated filesystems with their types, we can leverage the df command with its –output option:
$ df --output=source,fstype,target Filesystem Type Mounted on udev devtmpfs /dev tmpfs tmpfs /run /dev/sda1 ext4 / [...]
Moreover, we can see each partition Type as well. Let’s see how to apply this information for our purposes.
3. Exclude by Mount Point
Considering filesystems are always associated with mount points, we can use this to our advantage. For example, we might want to exclude a certain partition from the (default) recursive search.
Let’s locate the partition mount point first:
$ df --output=source,fstype,target Filesystem Type Mounted on udev devtmpfs /dev tmpfs tmpfs /run /dev/sda1 ext4 / tmpfs tmpfs /dev/shm tmpfs tmpfs /run/lock /dev/sda2 ext4 /home /dev/sda3 ext4 /tmp /dev/sda4 ext4 /var tmpfs tmpfs /run/user/0 tmpfs tmpfs /run/user/1000 xost:/nfs nfs4 /mnt/nfsx web:/nfs nfs4 /mnt/nsfw
In our hypothetical, we don’t want to go through either the /mnt/nfsx or /mnt/nsfw NFS mounts. To achieve this with find, we can use the standard -not operator for -path:
$ find / -not -path '/mnt/nfsx/*' -and -not -path '/mnt/nsfw/*'
While this does work, it has several drawbacks:
- unless we know the original filesystem, device, or mount point, manual analysis of the df output or similar is more or less our only choice
- exclusion is based on a string match (/mnt/nsfw/* won’t match ./nsfw even if they expand to the same path)
- wildcards are too general and can often lead to unwanted exclusions (/mnt/nfsw* also excludes /mnt/nfsw2/*)
- unless we specifically exclude them, the root paths (/mnt/nfsx and /mnt/nsfw, no trailing slash) remain in the output
Considering these potential problems, let’s explore another option.
4. Exclude by Filesystem
Like others, the find command comes in two main versions: standard and GNU. While the former has certain filters, the latter provides exclusive features that facilitate even more fine-grained searching.
4.1. Other Filesystems via xdev
To avoid any filesystem other than the one of the initial path, the standard POSIX find supports the -xdev switch:
$ find / -xdev
In short, the -xdev flag of the find command will print but not traverse paths that are mount points. In our earlier example, both /mnt/nfsx and /mnt/nsfw will be listed, but the search wouldn’t descend below these directories.
While this is a way to exclude NFS mounts, it also includes any other non-starting filesystem.
4.2. Specific Filesystem Types via fstype
One of the GNU find features is the filesystem type filter fstype:
$ find / -fstype nfs4
In this case, we only search through nfs4 mounts. To get a complete list of filesystem types supported by the current kernel, we can check the second column of the /proc/filesystems file:
$ cat /proc/filesystems [...] ext3 ext2 ext4 [...] xfs jfs msdos vfat minix hfs hfsplus qnx4 ufs btrfs nodev binfmt_misc udf iso9660 nodev nfs nodev nfs4 squashfs
Notably, nodev in the first column means the given type needs no physical devices on the system.
Combining -fstype with -not, we can exclude certain filesystem types during a search with find:
$ find / -not -fstype nfs4
Unfortunately, we can’t specify more than one filesystem type criteria. Still, we can use -fstype and multiple -path operators to gain more control.
In this article, we explored ways to limit the filesystems find traverses.
In conclusion, depending on our situation, we can exclude specific paths and filesystem types or avoid all non-starting filesystems.