[ksh] Zoekscript, resulttaat afhankelijk van directory?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
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.

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.

Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02-10 23:54

JaQ

Dit lijkt me een relevante link om je een hint te geven hoe je je probleem kan oplossen.

[ Voor 12% gewijzigd door JaQ op 09-05-2010 14:53 ]

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Ik weet wel redelijk hoe ik daarmee moet omgaan. Heb er ook al mee zitten spelen namelijk In principe zou echo "\"$1\"" moeten werken, en dat doet het ook wel, maar niet in een find...

Even het script ingekort:
find / -name "\"$1\"" 2>/dev/null (en wat andere varianten)
Geeft alleen nooit resultaat terug.

find / -name "$1" 2>/dev/null
Doet het wel, maar geeft in $HOME/bin een ander resultaat dan in andere mappen (in andere mappen werkt dit dus goed inclusief wildcard).

[ Voor 70% gewijzigd door matel op 09-05-2010 16:12 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Dan nog is die link van JaQ aan te raden om door te lezen want je doet iets structureel fout en dat kan alleen opgelost worden als je de basismaterie snapt.

Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02-10 23:54

JaQ

matel schreef op zondag 09 mei 2010 @ 15:52:
Ik weet wel redelijk hoe ik daarmee moet omgaan.
Blijkbaar niet :+

Je zal iig altijd een asterisk moeten omringen met dubbele quotes of moeten escapen als je deze aan het script voert, anders wordt de asterisk automatisch ge-expaned naar een lijst van bestanden in de huidige directory.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[JaQ@db ~]$ cat zoek.sh
#!/bin/ksh
#

ZOEKSTRING="$1"

echo "Zoekstring = ${ZOEKSTRING}"

find . -name "${ZOEKSTRING}" -print

[JaQ@db ~]$ ./zoek.sh "*.rpm"
Zoekstring = *.rpm
./sun-javadb-client-10.5.3-0.2.i386.rpm
./jre-6u18-linux-i586.rpm
./jdk-6u20-linux-i586.rpm
./sun-javadb-demo-10.5.3-0.2.i386.rpm
./sun-javadb-docs-10.5.3-0.2.i386.rpm
./sun-javadb-common-10.5.3-0.2.i386.rpm
./sun-javadb-javadoc-10.5.3-0.2.i386.rpm
./sun-javadb-core-10.5.3-0.2.i386.rpm

[ Voor 7% gewijzigd door JaQ op 09-05-2010 16:45 ]

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
@JaQ: dat bedoel ik. Ik wil geen quotes hoeven mee te geven aan het script. Ik wil gewoon $ ./zoek zoek* kunnen geven op de commandline :) Maar goed, misschien kan het ook gewoon niet omdat de shell er op die manier tussen zit dat ik in het script nooit af kan vangen of er een * is meegegeven.

Ik heb trouwens de link wel 4 keer doorgelezen en ben hem ook al eerder tegen gekomen toen ik opzoek was naar een oplossing voor iets anders. Maar goed, ik lees er misschien overheen omdat ik het gewoon niet 'zie'...

Nog simpeler voorbeeld
Maak een script met daarin alleen dit:
echo "\"$1\""

Roep het script aan met <script> zoek* en bekijk wat de output is.

edit: OK, ik ben wat verder: het lijkt met mijn $PATH te maken te hebben, hoe gek het mij ook lijkt?

[ Voor 65% gewijzigd door matel op 09-05-2010 17:04 ]


Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02-10 23:54

JaQ

matel schreef op zondag 09 mei 2010 @ 16:56:
@JaQ: dat bedoel ik. Ik wil geen quotes hoeven mee te geven aan het script. Ik wil gewoon $ ./zoek zoek* kunnen geven op de commandline :) Maar goed, misschien kan het ook gewoon niet omdat de shell er op die manier tussen zit dat ik in het script nooit af kan vangen of er een * is meegegeven.
Je kan geen niet-ge-escapede wildcard aan een script voeren.

edit:
Los daarvan: het lijkt er een beetje op dat je find opnieuw aan het uitvinden bent. Vind je dat echt nodig?

[ Voor 11% gewijzigd door JaQ op 09-05-2010 17:16 ]

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Kijk hier eens naar, ik kan dus wel een * meegeven aan het script:

code:
1
2
3
4
5
6
7
mathijn@NC6000Mint ~/bin $ /home/mathijn/bin/echo-tussenquotes zoek*
"zoek"
mathijn@NC6000Mint ~/bin $ cd ..
mathijn@NC6000Mint ~ $ pwd
/home/mathijn
mathijn@NC6000Mint ~ $ /home/mathijn/bin/echo-tussenquotes zoek*
"zoek*"


@JaQ: Voor thuis is het script inderdaad overkill, maar op het werk is het handig. Vooral ook omdat niet iedereen evenveel verstand heeft van Linux/Unix en al helemaal niet zit te wachten op ingewikkelde commando's.

Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02-10 23:54

JaQ

matel schreef op zondag 09 mei 2010 @ 17:21:
Kijk hier eens naar, ik kan dus wel een * meegeven aan het script:

code:
1
2
3
4
5
6
7
mathijn@NC6000Mint ~/bin $ /home/mathijn/bin/echo-tussenquotes zoek*
"zoek"
mathijn@NC6000Mint ~/bin $ cd ..
mathijn@NC6000Mint ~ $ pwd
/home/mathijn
mathijn@NC6000Mint ~ $ /home/mathijn/bin/echo-tussenquotes zoek*
"zoek*"
Je geeft geen zoek* mee, maar je geeft zoek mee + alle bestandsnamen (of directories) die beginnen met zoek. Dat is vast niet wat je bedoelde ;)

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
Ik geloof dat je gelijk hebt, maar ik heb in /home/mathijn/bin wel meer scripts staan die beginnen met zoek. Die zou ik dan toch moeten zien? In /home/mathijn staan geen bestanden/directories die beginnen met zoek. Of ik zie gewoon de eerste die overeen komt :)

[ Voor 9% gewijzigd door matel op 09-05-2010 17:30 ]


Acties:
  • 0 Henk 'm!

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 02-10 23:54

JaQ

Doe eens ipv een echo $1 een echo $@

[ Voor 4% gewijzigd door JaQ op 09-05-2010 17:29 ]

Egoist: A person of low taste, more interested in themselves than in me


Acties:
  • 0 Henk 'm!

  • matel
  • Registratie: Februari 2004
  • Laatst online: 10-01 23:25
code:
1
2
3
4
5
mathijn@NC6000Mint ~/bin $ /home/mathijn/bin/echo-tussenquotes zoek*
zoek zoek_kopie zoek-metdiff zoekq
mathijn@NC6000Mint ~/bin $ cd ..
mathijn@NC6000Mint ~ $ /home/mathijn/bin/echo-tussenquotes zoek*
zoek*


Eigenlijk best verraderlijk zeg :) Goed, dan zal ik me erbij neerleggen dat een een wildcard meegeven niet mogelijk is zonder deze tussen quotes te zetten.
Pagina: 1