I want to get the number of lines in my application. I am using this code:
find . \"(\" -name \"*.m\" -or -name \"*.h\" \")\" -print | xargs wc -l
Does one of your filenames have a quote in it? Try something like this:
find . "(" -name "*.m" -or -name "*.h" ")" -print0 | xargs -0 wc -l
The -print0
argument tells find
to use the NULL character to terminate each name that it prints out. The -0
argument tells xargs
that its input tokens are NULL-terminated. This avoids issues with characters that otherwise would be treated as special, like quotes.
After some tinkering, I found that this command worked for me (because I had spaces and unmatched quotations in my filenames):
find . -iname "*USA*" -exec cp "{}" /Directory/to/put/file/ \;
.
refers to the location the search is being run
-iname
followed by the expression refers to the match criteria
-exec cp "{}" /Directory/to/put/file/ \;
tells the command to execute the copy command where each file found via -iname
replaces "{}"
You need the \;
to denote to the exec command that the cp
statement is ending.
This can happen because you have a single quote in a filename somewhere...
i.e., -> '
To find the problem file, run the following in the terminal:
\find . | grep \'
and it can also happen if you have an alias for xargs setup that's causing an issue. To test if this is the case, just run xargs with a \
in front of it, e.g.
\find . | \xargs ....
The "" simply means "run the command without any aliases"
The canonical way to solve quotes, spaces and special characters problems when using find
is to use the -exec
option instead of xargs
.
For your case you can use:
find . "(" -name "*.m" -or -name "*.h" ")" -exec wc -l "{}" \;