50

When I used the find command, I almost always need to search the local drives. But, I almost always have super large network shares mounted and these are included in the search. Is there an easy way to exclude those in the find command, grep and other similar commands? Example:

find / -name .vimrc

Flotsam N. Jetsam
  • 1,613
  • 8
  • 22
  • 34

3 Answers3

70

If you're using GNU find (as is used on most Linux systems), you'll want to use -mount:

find / -mount -name .vimrc

OS X/MacOS provides the local pseudo-fstype. This not in GNU find (fstypes recognized by GNU find).

Use the -fstype local option to find on MacOS:

find / -fstype local -name .vimrc

If you want to exclude only specific paths, you could use -prune:

find / -path "/path/to/ignore" -prune -o -name .vimrc

Update: MacOS Catalina (Jan 2022)

I'm two major releases behind the latest MacOS, but some has changed.

First, MacOS now supports the -mount option. The man page for find says "The same thing as -xdev, for GNU find compatibility."

Second, -fstype local still seems to work. The man page Indiates that it "matches any file system physically mounted on the system where the find is being executed".

I did a test with two drives mounted in /Volumes, one a USB flash drive (which I think counts as physically mounted) and the other a network drive. I ran find /Volumes <option> -name '*txt'. Running with -mount returned no results immediately since there were no such files on the current filesystem. Running with -fstype local found a .txt file on the USB drive very quickly and then seemed to traverse the full mounted drive without returning any files (even though some do exist).

Doug Harris
  • 27,333
  • 17
  • 78
  • 105
  • does that work for grep too? – Flotsam N. Jetsam Jan 05 '11 at 15:36
  • 1
    I don't think grep has such an option. I usually used `find` pipe to `grep` as shown in this answer: http://superuser.com/questions/80033/command-line-wizardry-spaces-in-file-names-with-find-grep-xargs/80050#80050 . Lately, I've been using `ack` (http://betterthangrep.com/) instead, but `ack` doesn't seem to have an option to search only local drives. – Doug Harris Jan 05 '11 at 15:43
  • My edit was rejected to this, so just making it a comment. Basically the first example is wrong, because you need to add `-prune` to it or it will still traverse the undesired file systems. The second example I believe was meant to be `-path` instead of `-name` so it will ignore the path. FWIW... the last example does work, it stays on the "current filesystem" so doesn't traverse others. – rogerdpack Apr 16 '19 at 17:48
  • This answer needs an edit... it's now 2020, and this just does not work on macOS any longer. – Seamus Oct 13 '20 at 08:22
  • This is current up to MacOS Mojave. I have not installed Catalina yet so I cannot update. If somebody else would read the `find` man page and submit an edit, I'd appreciate it. – Doug Harris Oct 13 '20 at 14:37
26

man find shows:

-xdev Don't descend directories on other filesystems.

Kamil Maciorowski
  • 69,815
  • 22
  • 136
  • 202
penguinjeff
  • 359
  • 3
  • 3
0

Original question was to find on local disk only, so for the sake of completeness, here's what I used;

for PART in `awk '(!/^#/ && $6 != "0" || $3 == "xfs" ) { print $2 }' /etc/fstab 2>/dev/null`; do find $PART -xdev -name .vimrc -print 2>/dev/null; done

As long as your fstab is set up properly it should only search the local disks; ie, cifs mounts should have that final flag set to 0. I included the OR for xfs filesystems when we started going to RHEL7, they should be set to 0 also as they aren't meant to do the disk reorg after so many restarts.

Hope that helps.