Problems with find -exec somecommand | tosomeother command

Randall R Schulz rrschulz@cris.com
Fri Oct 4 12:41:00 GMT 2002


Sheryl,

[ Non-Cygwin-specific ]


Here's how I'd do this:

         find . -name "*.frm" -exec wc -l {} \;


The result looks something like this (I changed the ".frm" suffix to 
".java" for the purpose of finding some files on my system):

    1114 ./DeferredUpdateKB.java
     295 ./Definitor.java
      93 ./FlatFormatStrategy.java
      59 ./FormatStrategy.java
     139 ./FormattingCursor.java
     111 ./FormulaPrinter.java
      77 ./FormulaRenderer.java
    1379 ./KBContext.java
    4503 ./KIF3.java
     191 ./KIF3Constants.java
     544 ./KIF3Generator.java
     293 ./KIF3InfixPrinter.java
    2431 ./KIF3TokenManager.java
      91 ./LexicalGenerator.java
    1912 ./NameTable.java
     298 ./ParseActions.java
     192 ./ParseException.java
     913 ./PrefixPrinter.java
     175 ./PrettyFormatStrategy.java
     401 ./SimpleCharStream.java
    1848 ./TauTest.java
      81 ./Token.java
     133 ./TokenMgrError.java


To let you know why what you tried wasn't working, you must realize that 
the pipe split the "find" command (and the "cat" subprocesses it spawns) 
from the "tail" command. The "-exec" option of find is pretty much just a 
means of invoking the Unix "exec(2)" system call. It is not like the 
"system(3)" library routine, which uses a shell to interpret the command 
string.

If you want pipelines, glob expansion or other shell features in the 
commands executed by the "-exec" option, you should use "sh -c" or "bash 
-c". Note, too, that in that case the command argument to the "-c" option 
must be a single argument. This can get tricky as far as quoting and all. 
Fortunately, the "{}" marker into which the current "find" target is 
substituted does work when embedded within a larger string--it need not be 
an total, isolated "find" argument.

Good luck.

Randall Schulz
Mountain View, CA USA


At 11:39 2002-10-04, Sheryl McKeown wrote:
>Hello,
>
>I'm attempting to find the number of lines in each
>file of a source directory.
>
>Using bash, I'm using the following command:
>
>find . -name "*.frm" -exec cat -n {} | tail -n1 \;
>but it returns the error
>
>cfind: missing argument to `-exec'
>tail: ;: No such file or directory
>
>I've tried various quoting schemes but I can't seem to
>get it to work.
>
>I am running XP Prof SP1.
>
>Any help is appreciated.
>
>-Sheryl


--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list