我想获取应用程序中的行数。我正在使用此代码:
find . "(" -name "*.m" -or -name "*.h" ")" -print | xargs wc -l
它在其他应用程序中运行良好,但对于我的一个应用程序,它给出错误“xargs unterminated quote”。
答案 0 :(得分:63)
您的某个文件名中是否有引号?尝试这样的事情:
find . "(" -name "*.m" -or -name "*.h" ")" -print0 | xargs -0 wc -l
-print0
参数告诉find
使用NULL字符终止它打印出来的每个名字。 -0
参数告诉xargs
它的输入标记是以NULL结尾的。这避免了字符的问题,否则将被视为特殊字符,如引号。
答案 1 :(得分:7)
这可能发生,因为你在某个文件名中有一个单引号...
ie - > '
要查找问题文件,请在终端中运行以下命令:
\find . | grep \'
如果您有xargs设置的别名导致问题,也会发生这种情况。要测试是否是这种情况,只需使用' \'运行xargs。在它面前,例如
\find . | \xargs ....
" \"只是意味着"运行命令而没有任何别名"
答案 2 :(得分:0)
使用find
时解决引号,空格和特殊字符问题的规范方法是使用-exec
选项而不是xargs
。
对于您的情况,您可以使用:
find . "(" -name "*.m" -or -name "*.h" ")" -exec wc -l "{}" \;
答案 3 :(得分:0)
经过一番修补,我发现此命令对我有用(因为我的文件名中包含空格和不匹配的引号):
find . -iname "*USA*" -exec cp "{}" /Directory/to/put/file/ \;
.
是指搜索运行的位置
-iname
后跟表达式是指匹配条件
-exec cp "{}" /Directory/to/put/file/ \;
告诉命令执行复制命令,其中通过-iname
找到的每个文件替换为"{}"
您需要\;
来表示exec命令cp
语句即将结束。