(Terug) naar scripts op heeck.nl of heeck.nl

******************************************************************************************
qfind, om snel te vinden wat je zoekt

Omdat bestanden zoeken vanaf de root op een unix/linux-machine nog al wat tijd kan kosten en omdat je vaak op naam zoekt naar zaken die toch al wat langer op de machine rondhangen, zoals configuratiefiles e.d., kun je sneller zoeken in een voorgevulde lijst met alle files op het systeem dan op de filesystems zelf. Het onderstaande script, qfind, zoekt met grep door zo'n lijst en kan die ook zelf opbouwen.

Voor het zoeken naar een bepaalde string aan het begin van een bestandsnaam bouw ik de zoekterm om, het dakje wat je voor grep meegeeft wordt dan vervangen door een slash. Dit gebeurt op regels 64-68. Zoekend naar ^hosts wordt grep in plaats daarvan gevoed met "/hosts" om zo b.v. /etc/hosts terug te vinden. De optie om op het einde van een regel te zoeken, zoekstring$, werkt zoals verwacht bij grep.
Verder mag de grep parameter -i voor case-insensitivity ook meegegeven worden.

Verder formatteer ik de datum van de filelist nog naar wat leesbaarders als er op linux gedraaid wordt. De RedHat versies waar ik mee werk kent tenminste de optie -r bij date.
Op HP-UX 11 lukte me dat niet, vandaar de uname-test op regels 57-60.

Het vullen van de lijst doe ik 1 á 2 maal daags door qfind vanuit de crontab te starten met de optie -buildlist en een redirect van stdout naar /dev/null. De optie -s onderdrukt alleen de boodschappen, zodat de uitkomst als input voor andere zaken te gebruiken is.

N.B.: Als je semi-handige gebruikers op je machine hebt rondspoken die graag verder kijken dan hun pad lang is en je wil het ze niet te gemakkelijk maken kun je het beste qfind zelf van root:sys maken en op 700 zetten en daarnaast nog een umask inbouwen voordat je de filelist produceert op regel 25, of een 'chmod-je' daarna.

01 #!/bin/sh
02 ########## config ##########
03 filelist=/tmp/filelist.txt
04 ######## end config ########
05 #
06 ######### defaults #########
07 type=", case sensitive"
08 verbose=1
09 ####### end defaults #######
10 #
11 while [ $# -gt 0 ]
12 do
13   case $1 in
14     [-][Ii]) 
15     parm=-i
16     type=", case insensitive"
17     shift;;
18     
19     [-][Ss]) 
20     verbose=0
21     shift;;
22     
23     [-]buildlist) 
24     echo "Building $filelist"
25       find / > $filelist 2>/dev/null
26     while [ $1 ]
27     do
28     search=`basename $filelist`
29     shift
30     done;;
31     
32     *)
33     echo $1 | grep -q "-"
34     if [ $? -ne 0 ]
35     then
36     search=`echo $1`
37     else
38     echo "Parameter $1 ignored"
39     fi
40     shift;;
41   esac
42 done
43 if [ $verbose -eq 1 ]
44 then
45 echo "************* qfind by jh *************"
46 fi
47 if [ -r $filelist ]
48 then
49   if [ $(wc -l $filelist| cut -f1 -d'/') -lt 10000 ]
50   then
51     echo "Filesetlist is very short, may be invalid"
52   fi
53   if [ $search ]
54   then
55     if [ $verbose -eq 1 ]
56     then
57       case $(uname) in
58         Linux) echo "Filesetlist created on: $(date -r $filelist +%d-%m-%Y,%H:%M)";;
59         HP-UX) echo "Filesetlist created on: $(ls -l $filelist | cut -c45-58)";;
60       esac
61       echo "Searching for: $search $type"
62       echo "Files found:"
63     fi
64     echo $search | grep -q ^^
65     if [ $? -eq 0 ]
66     then
67       search="`echo $search|sed -e's/\^/\//'`"
68     fi
69     grep $parm "$search" $filelist 2>/dev/null
70   else
71     echo "$0 searches in $filelist"
72     echo "usage: $0 [-i] [-s] [^]filetofind[$]| -buildlist"
73     echo "use -i for case-insensitive search"
74     echo "use -s to suppress messages"
75     echo "use -buildlist to (re-)create $filelist"
76   fi
77 else
78   echo "Error: $filelist, needed by $0, is missing,"
79   echo "Pls run $0 -buildlist"
80   echo "before searching again."
81 fi
82 if [ $verbose -eq 1 ]
83 then
84 echo "***************************************"
85 fi
Als je last hebt van de regelnummers in deze pagina geef je hem maar aan je systeembeheerder :-)
* Begin **********************************************************************************