Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting error "xargs unterminated quote" when tried to print the number of lines in terminal

Tags:

macos

xargs

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

It is working fine in other applications but for one of my applications it is giving the error "xargs unterminated quote".

like image 828
Lena Avatar asked Jul 25 '12 12:07

Lena


4 Answers

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.

like image 68
Gary G Avatar answered Nov 13 '22 08:11

Gary G


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 \' 

you can also run xargs like so to effectively address this issue:

xargs -I

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"

like image 24
Brad Parks Avatar answered Nov 13 '22 10:11

Brad Parks


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 "{}" \;
like image 5
Ortomala Lokni Avatar answered Nov 13 '22 09:11

Ortomala Lokni


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.

like image 1
ngopal Avatar answered Nov 13 '22 09:11

ngopal