rlm@1
|
1 #!/bin/bash
|
rlm@1
|
2 # Copyright (c) 2004 Matthias S. Benkmann <article AT winterdrache DOT de>
|
rlm@1
|
3 # You may do everything with this code except misrepresent its origin.
|
rlm@1
|
4 # PROVIDED `AS IS' WITH ABSOLUTELY NO WARRANTY OF ANY KIND!
|
rlm@1
|
5
|
rlm@1
|
6 #The following list should contain the mount points of all filesystems
|
rlm@1
|
7 #that are to be scanned as a space-separated list within parentheses.
|
rlm@1
|
8 #/ will usually be in this list and if you have /usr
|
rlm@1
|
9 #on a separate partition, it will also be in this list.
|
rlm@1
|
10 #Mount points whose filesystems are special, such as procfs or sysfs must
|
rlm@1
|
11 #not be in this list. While a simple find on those special filesystems should
|
rlm@1
|
12 #be harmless, operations such as "-exec grep something" are NOT SAFE and may
|
rlm@1
|
13 #have HARMFUL SIDE-EFFECTS, especially when performed as root.
|
rlm@1
|
14 fs_to_scan=(/)
|
rlm@1
|
15
|
rlm@1
|
16 #Files with a path prefix found in the following list are ignored. As the
|
rlm@1
|
17 #main function of this script is to help you find files that contain
|
rlm@1
|
18 #hardwired paths to /tools or other unwanted references to
|
rlm@1
|
19 #your build system, you will usually prune any directories that don't contain
|
rlm@1
|
20 #files of interest, such as /tools (whose files naturally refer to /tools)
|
rlm@1
|
21 #and your package users' home directories (which may also test positive if
|
rlm@1
|
22 #you have unpacked and configured sources lying around).
|
rlm@1
|
23 #NOTE: The LFS-6.0 book uses a ramfs mounted on /dev and with that setup
|
rlm@1
|
24 #/dev does not need to be in the prune list. But since there is no requirement
|
rlm@1
|
25 #that /dev have its on filesystem it's better to prune it explicitly.
|
rlm@1
|
26 prune_prefixes=(/home /usr/src /dev /tools) #NO TRAILING SLASHES!!!
|
rlm@1
|
27
|
rlm@1
|
28 if [ $# -lt 1 -o "$1" = "--help" ]; then
|
rlm@1
|
29 echo 1>&2
|
rlm@1
|
30 echo 1>&2 'USAGE: '"${0##*/}"' <grep-commands>'
|
rlm@1
|
31 echo 1>&2
|
rlm@1
|
32 echo 1>&2 ' grep -l <grep-commands> -- <file>'
|
rlm@1
|
33 echo 1>&2 ' will be executed for each *regular file* <file>'
|
rlm@1
|
34 echo 1>&2 ' ATTENTION! If you override the -l switch with a switch that makes grep'
|
rlm@1
|
35 echo 1>&2 ' output all individual matches rather than just the matching files,'
|
rlm@1
|
36 echo 1>&2 ' then DO NOT redirect output to a file that is in a directory that will be'
|
rlm@1
|
37 echo 1>&2 ' scanned, or you risk creating an endless loop that will cause your'
|
rlm@1
|
38 echo 1>&2 ' output file to grow till your disk is full.'
|
rlm@1
|
39 echo 1>&2
|
rlm@1
|
40 exit 1
|
rlm@1
|
41 fi
|
rlm@1
|
42
|
rlm@1
|
43 #suppress ugly debug output from shell
|
rlm@1
|
44 trap ':' SIGPIPE
|
rlm@1
|
45
|
rlm@1
|
46 #construct find commands that match the prune_prefixes. Each prefix will be
|
rlm@1
|
47 #matched as -path <prefix> -or -path <prefix>/*
|
rlm@1
|
48 #so that the directory itself and all subdirectories are matched.
|
rlm@1
|
49 y=(\( -false)
|
rlm@1
|
50 for ((i=0; $i<${#prune_prefixes[@]}; i=$i+1))
|
rlm@1
|
51 do
|
rlm@1
|
52 y[${#y[@]}]='-or'
|
rlm@1
|
53 y[${#y[@]}]=-path
|
rlm@1
|
54 y[${#y[@]}]="${prune_prefixes[$i]}"
|
rlm@1
|
55 y[${#y[@]}]='-or'
|
rlm@1
|
56 y[${#y[@]}]=-path
|
rlm@1
|
57 y[${#y[@]}]="${prune_prefixes[$i]}/*"
|
rlm@1
|
58 done
|
rlm@1
|
59 y[${#y[@]}]=')'
|
rlm@1
|
60
|
rlm@1
|
61 cmd_pre=(-type f -exec grep -l)
|
rlm@1
|
62 cmd_post=(-- {} \;)
|
rlm@1
|
63
|
rlm@1
|
64 #In the following find command, the part
|
rlm@1
|
65 # -not ( ( "${y[@]}" -prune ) -or "${y[@]}" )
|
rlm@1
|
66 #is responsible for preventing the files that match prune_prefixes from
|
rlm@1
|
67 #being processed. The 2nd "${y[@]}" may seem redundant, but it isn't, because
|
rlm@1
|
68 #-prune has no effect and is always false when -depth is used (which someone
|
rlm@1
|
69 #might do in the future).
|
rlm@1
|
70 #The -true before "$@" ensures that -depth can be passed as 1st parameter
|
rlm@1
|
71 #of $cmd_pre (should someone change it in the future).
|
rlm@1
|
72 find "${fs_to_scan[@]}" -xdev -noleaf \
|
rlm@1
|
73 -not \( \( "${y[@]}" -prune \) -or "${y[@]}" \) \
|
rlm@1
|
74 -and \( -true "${cmd_pre[@]}" "$@" "${cmd_post[@]}" \)
|