annotate previous-work/more_control_helpers/bin/grep_all_regular_files_for @ 1:d6bef198ae71

add work by Matthias S. Benkmann which is the inspiration for this project.
author Robert McIntyre <rlm@mit.edu>
date Tue, 08 Jan 2013 11:45:01 +0000
parents
children
rev   line source
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[@]}" \)