sslug-teknik team mailing list archive
-
sslug-teknik team
-
Mailing list archive
-
Message #51552
Re: find problem
Robert Larsen wrote:
En gang imellem kan jeg ikke få "find" til at virke. For det meste
virker det, og jeg fatter ikke, hvad det er, der går galt.
-------------------------------------------------------------------------------
[robert@mercury opengl]$ find --version
GNU find version 4.1.7
[robert@mercury opengl]$ find . -name *.cpp
find: paths must precede expression
Det er fordi du ikke forstår shell'ens wildcard expansion mekanik og
find kommandoens syntax. Undskyld jeg siger det, men sådan er det altså.
Når du taster *.cpp i en shell kommando, er det SHELL'en der expanderer
wild card'et til listen over alle filer, hvis navn matcher wildcardet, i
current directory.
Dvs hvis du har flere filer der hedder noget med .cpp, vil finde
kommandoen se listen over disse filer efter "-name" og det er en syntaxfejl.
Det medfører også, at hvis du bare har én fil i directory'et (f.ex.
a.cpp), vil shellen substituere wildcardet med det navn, og find vil
finde filen. Men ikke andre (med mindre der findes flere med det navn i
træet under).
Og det vil sige at find kommandoen IKKE gør det du håber på - den finder
ikke alle .cpp-filer i træet.
Men hvis du skifter til et directory, hvor der IKKE er nogensomhelst
filer, der hedder noget med .cpp, så vil shellen IKKE foretage expansion
(hvad skulle den expandere?) og så vil find kommandoen få parameteren
"*.cpp" - finde alle cpp-filer i træet og så er du glad. Denne gang.
Måden at komme ud over dette på er at bruge quotes. Af den rigtige
slags, vel at mærke. Hvis du sætter noget i "", vil shellen nemlig
stadig foretage expansion. Men hvis du bruger apostrof ('), gør den det
ikke.
Så din kommando burde have været: find . -name '*.cpp'
Og det ville have virket.
Disse principper finder naturligvis også anvendelse i alle andre
situtioner, hvor shellen er indblandet.
Du kan prøve det af ved at bruge "echo" kommandoen.
echo *
echo a*
echo *a
echo *a*
og så videre - det vil vise dig hvordan expansion af wildcards foregår.
Forresten - skulle du bare se filer i current directory? Så havde
"echo *.cpp" været tilstrækkeligt - ifølge ovenstående.
God fornøjelse
--
Jon Svejgaard
====================================================================
| ACE - UNIX/Linux Consultancy
| Hjorthøjvej 2 / DK-4291 Ruds Vedby
mail: jon@xxxxxx | DENMARK
http://www.ace.dk | +45 5826 1799 / +45 4052 0799
====================================================================
References