web-dev-qa-db-ja.com

端末の行数を出力しようとするとエラー「xargs unterminated quote」が発生する

アプリケーションの行数を取得したいのですが。私はこのコードを使用しています:

find . "(" -name "*.m" -or -name "*.h" ")" -print | xargs wc -l

他のアプリケーションでは問題なく機能していますが、私のアプリケーションの1つでは、「xargs unterminated quote」というエラーが発生します。

31
Lena

ファイル名の1つに引用符が含まれていますか?次のようなものを試してください:

find . "(" -name "*.m" -or -name "*.h" ")" -print0 | xargs -0 wc -l

-print0引数は、出力する各名前を終了するためにNULL文字を使用するようにfindに指示します。 -0引数は、入力トークンがNULLで終了することをxargsに伝えます。これにより、引用符のように特別なものとして扱われる文字の問題が回避されます。

65
Gary G

これは、ファイル名に単一引用符がどこかに含まれているために発生する可能性があります...

すなわち-> '

問題のあるファイルを見つけるには、ターミナルで次のコマンドを実行します。

\find . | grep \' 

また、問題を引き起こしているxargsセットアップのエイリアスがある場合にも発生する可能性があります。これが当てはまるかどうかをテストするには、xargsの前に「\」を付けて実行します。

\find . | \xargs ....

「\」は単に「エイリアスなしでコマンドを実行する」ことを意味します

7
Brad Parks

findを使用するときに引用符、スペース、特殊文字の問題を解決する標準的な方法は、xargsではなく-execオプションを使用することです。

あなたのケースではあなたが使うことができます:

find . "(" -name "*.m" -or -name "*.h" ")" -exec wc -l "{}" \;
0
Ortomala Lokni

いじくり回した後、このコマンドが機能することがわかりました(ファイル名にスペースと一致しない引用符があったためです)。

find . -iname "*USA*" -exec cp "{}" /Directory/to/put/file/ \;

.は、検索が実行されている場所を示します

-inameの後に式が続くと、一致基準を参照します

-exec cp "{}" /Directory/to/put/file/ \;は、-inameで見つかった各ファイルが"{}"を置き換えるコピーコマンドを実行するようにコマンドに指示します

cpステートメントが終了していることをexecコマンドに示すには、\;が必要です。

0
ngopal