 |
(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 **********************************************************************************
|
|  |