Ik heb een script gemaakt (zoek) om snel op een makkelijke manier te zoeken. Het script maakt gebruik van find en locate en filtert de unieke en gemeenschappelijke resultaten. Het script geeft echter een ander resultaat terug als ik het in een bepaalde directory ($HOME/bin) uitvoer en daarbij gebruik maak van wildcards (*).
Eerst de inhoud van $HOME/bin:
-rwxr-xr-x 1 mathijn mathijn 399 2010-05-05 20:14 zoek_kopie
-rwxr-xr-x 1 mathijn mathijn 818 2010-05-06 18:21 zoek-metdiff
-rwxr-xr-x 1 mathijn mathijn 2964 2010-05-09 13:23 zoek
Vooraf aan het echte probleem...
Het gaat ook op commandline zelf al fout:
$HOME/bin $ find / -name zoek*
Geeft terug: find: padnamen moeten voorafgaan aan expressies (zoek_kopie)
Maar in $HOME bijvoorbeeld, krijg ik wel de verwachte resultaten te zien?
Natuurlijk kan ik find / -name "zoek*" gebruiken, dan werkt het weer wel goed.
Een soortgelijk iets lijkt aan de hand te zijn met locate. Alleen werkt die op de commandline wel altijd goed, maar in het script zelf niet.
Kortom: beetje raar
Het echte probleem
De bedoeling is dat ik zonder quotes mee te geven, toch gebruik kan maken van wildcards (voorbeeld: $ zoek zoek*). Zie het als een stukje gebruiksvriendelijkheid.
Ik gebruik zelf Linux Mint 8, maar onder AIX 6 moet het script ook werken.
Eerst de inhoud van $HOME/bin:
-rwxr-xr-x 1 mathijn mathijn 399 2010-05-05 20:14 zoek_kopie
-rwxr-xr-x 1 mathijn mathijn 818 2010-05-06 18:21 zoek-metdiff
-rwxr-xr-x 1 mathijn mathijn 2964 2010-05-09 13:23 zoek
Vooraf aan het echte probleem...
Het gaat ook op commandline zelf al fout:
$HOME/bin $ find / -name zoek*
Geeft terug: find: padnamen moeten voorafgaan aan expressies (zoek_kopie)
Maar in $HOME bijvoorbeeld, krijg ik wel de verwachte resultaten te zien?
Natuurlijk kan ik find / -name "zoek*" gebruiken, dan werkt het weer wel goed.
Een soortgelijk iets lijkt aan de hand te zijn met locate. Alleen werkt die op de commandline wel altijd goed, maar in het script zelf niet.
Kortom: beetje raar
Het echte probleem
De bedoeling is dat ik zonder quotes mee te geven, toch gebruik kan maken van wildcards (voorbeeld: $ zoek zoek*). Zie het als een stukje gebruiksvriendelijkheid.
Ik gebruik zelf Linux Mint 8, maar onder AIX 6 moet het script ook werken.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| #!/usr/bin/ksh ########################################################################## # Script om snel en makkelijk bestanden te zoeken # # Versie 0.4 # # Versiehistorie # ME - 03-05-10: Initiele versie. Gebruikt alleen find. # ME - 06-05-10: Gebruikt ook locate en diff # ME - 07-05-10: Comm ipv diff om gemeenschappelijke resultaten weer te laten geven # Tevens geen gebruik meer gemaakt van case ivm wildcard * # ME - 08-05-10: Melding wanneer niets is gevonden, output opschonen, opmaak verbeteringen # ########################################################################## # Diff uitvoeren en verzamelen in centraal bestand #diff -a /tmp/tmpzoeklocate /tmp/tmpzoekfind >/tmp/tmpzoekdiff # Als er geen argumenten zijn meegegeven moet de help worden weergegeven if [[ $# -eq 0 ]] then echo "Gebruik: 'zoek <bestandsnaam>' om een bestand te zoeken." echo " Het gebruik van wildcards is toegestaan, zet de bestandsnaam inclusief wildcard tussen quotes." exit fi # Algemene melding echo "Even geduld a.u.b. Bezig met doorzoeken filesysteem met find en locate..." # Teller op 0 zetten i=0 # Zoekresultaten verzamelen # Met locate locate -b "\\$1" 2>/dev/null | sort -d >/tmp/tmpzoeklocate grep / /tmp/tmpzoeklocate >/dev/null 2>&1 if [[ $? -ne 0 ]]; then i=$(expr $i + 1) fi # Met find find / -name "$1" 2>/dev/null | sort -d >/tmp/tmpzoekfind grep / /tmp/tmpzoekfind >/dev/null 2>&1 if [[ $? -ne 0 ]]; then i=$(expr $i + 1) fi # Resultaten filteren en weergeven indien nodig comm -3 -2 /tmp/tmpzoeklocate /tmp/tmpzoekfind >/tmp/tmpzoekmergelocate # Helaas geeft comm geen exit-fout terug als er geen resultaten zijn; via grep een foutsituatie onderscheppen grep / /tmp/tmpzoekmergelocate >/dev/null 2>&1 if [[ $? -ne 0 ]]; then #echo "Niets (exclusief) gevonden met locate" rm /tmp/tmpzoekmergelocate else echo "" echo "__________________Resultaten locate_____________________" echo "" cat /tmp/tmpzoekmergelocate rm /tmp/tmpzoekmergelocate fi comm -3 -1 /tmp/tmpzoeklocate /tmp/tmpzoekfind >/tmp/tmpzoekmergefind grep / /tmp/tmpzoekmergefind >/dev/null 2>&1 if [[ $? -ne 0 ]]; then #echo "Niets (exclusief) gevonden met find" rm /tmp/tmpzoekmergefind else echo "" echo "___________________Resultaten find______________________" echo "" cat /tmp/tmpzoekmergefind rm /tmp/tmpzoekmergefind fi comm -1 -2 /tmp/tmpzoeklocate /tmp/tmpzoekfind >/tmp/tmpzoekgemeen grep / /tmp/tmpzoekgemeen >/dev/null 2>&1 if [[ $? -ne 0 ]]; then #echo "Geen gemeenschappelijke resultaten" rm /tmp/tmpzoekgemeen else echo "" echo "____________Gemeenschappelijke resultaten_______________" echo "" cat /tmp/tmpzoekgemeen rm /tmp/tmpzoekgemeen fi # Geef een melding als helemaal niets is gevonden if [[ $i = 2 ]]; then echo "" echo "Niets gevonden" fi echo "" # Opruimen tijdelijke bestanden rm /tmp/tmpzoeklocate rm /tmp/tmpzoekfind #rm /tmp/tmpzoekdiff # De rest van de tijdelijke bestanden ook hiertussen zetten, maar dan eerst $? -eq 0 gebruiken. |