22

I wanted to execute a script that picks out a random directory path:

find / -type d | shuf -n1 

Unfortunately I get error messages about the prohibition of entering certain directories.

How can I exclude a directory from the search with find ?

3 Answers 3

26

To exclude specific paths, on Linux:

find / -path /sys -prune -o -path /proc -prune -o -type d

Another approach is to tell find not to recurse under different filesystems.

find / -xdev -type d

You could also use locate to query a database of file names (usually updated nightly, you could also update it manually using updatedb) instead of the live system.

locate '*' | shuf -n 1
3
  • great, short and insightful. find / -xdev -type d itself works, but find / -xdev -type d | shuf -n 1 displays error messages. Commented Mar 29, 2015 at 23:32
  • 1
    @AbdulAlHazred you haven't said what messages but I'm guessing they're "permission denied" errors. Either run the command as root or just ignore the errors by sending them to stderr: find / -xdev -type d 2>/dev/null. Commented Mar 29, 2015 at 23:42
  • 1
    Couldn't you just do find / \( -path /sys -o -path /proc \) -prune -o -type d Would be useful if you want to exclude more dirs like /dev or /tmp, etc. Commented Jun 30, 2018 at 14:04
8

with GNU find you may also use regex options, e. g. like this:

find / -regextype posix-extended -regex "/(sys|srv|proc)" -prune -o -type d
1
  • 1
    that's the nicest approach, by far (rant: so there's a gnu option that makes find / usable on gnu linux like on any other OS that didn't have a shitty /proc implementation ;-) Commented Sep 7, 2019 at 10:17
1

One method is to only include real filesystems.

Determine all mount points for real filesystems, and put them on one line:

$ realfs=$(df -x tmpfs -x devtmpfs | tail -n +2 | awk '{print $6;}' | xargs)
$ echo $realfs
/ /home /dos /Data 

Run find only against those mount points.

$ find ${realfs} -type d |& grep -v "Permission denied" | shuf -n1
/Data/share/source/pan2/.git/refs/tags

(|& is a bashism added to 4.x -- works for me on 4.4.)

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.