macos xargs

macos - Obteniendo el error "xargs unterminated quote" al intentar imprimir el número de líneas en el terminal



(4)

Quiero obtener el número de líneas en mi aplicación. Estoy usando este código:

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

Está funcionando bien en otras aplicaciones, pero para una de mis aplicaciones está dando el error "xargs unterminated quote".


¿Tiene uno de sus nombres de archivo una cita en él? Intenta algo como esto:

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

El argumento -print0 le dice a find que use el carácter NULO para terminar cada nombre que se imprima. El argumento -0 le dice a xargs que sus tokens de entrada están terminados en NULL. Esto evita problemas con los caracteres que de otra manera se tratarían como citas especiales, como comillas.


Después de algunos retoques, encontré que este comando funcionó para mí (porque tenía espacios y citas inigualables en mis nombres de archivo):

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

. se refiere a la ubicación en la que se está ejecutando la búsqueda

-iname seguido de la expresión se refiere a los criterios de coincidencia

-exec cp "{}" /Directory/to/put/file/ /; le indica al comando que ejecute el comando de copia donde cada archivo encontrado a través de -iname reemplaza "{}"

Necesitas el /; para denotar al comando exec que la sentencia cp está finalizando.


Esto puede suceder porque tienes una sola cita en un nombre de archivo en algún lugar ...

es decir -> ''

Para encontrar el archivo problemático, ejecute lo siguiente en el terminal:

/find . | grep /'

y también puede suceder si tiene un alias para la configuración de xargs que está causando un problema. Para probar si este es el caso, simplemente ejecute xargs con una ''/' delante, por ejemplo

/find . | /xargs ....

El "/" simplemente significa "ejecutar el comando sin ningún alias"


La forma canónica de resolver problemas de comillas, espacios y caracteres especiales cuando se usa find es usar la opción -exec lugar de xargs .

Para su caso puede utilizar:

find . "(" -name "*.m" -or -name "*.h" ")" -exec wc -l "{}" /;