Estaba tratando de encontrar todos los archivos de cierto tipo distribuidos en subdirectorios, y para mis propósitos solo necesitaba el nombre de archivo. Intenté eliminar el componente de ruta a través de basename, pero no funcionó con xargs:
$ find . -name '*.deb' -print | xargs basename
basename: extra operand `./pool/main/a/aalib/libaa1_1.4p5-37+b1_i386.deb'
Try `basename --help' for more information.
Me sale lo mismo (exactamente el mismo error) con cualquiera de estas variaciones:
$ find . -name '*.deb' -print0 | xargs -0 basename
$ find . -name '*.deb' -print | xargs basename {}
Esto, por otro lado, funciona como se esperaba:
$ find . -name '*.deb' -exec basename {} \;
foo
bar
baz
Esto sucede en Cygwin y Debian 5.0.3 actualizados. Mi diagnóstico es que xargs está pasando por alguna razón dos líneas de entrada al nombre base, pero ¿por qué? ¿Que está pasando aqui?
fuente

xargses que crea una lista de argumentos y alimenta cada uno al comando que viene después. de lo contrario, ¿cuál es la diferencia entre eso yfind . -name '*.deb' | basename?-aopción: "admite múltiples argumentos y trata cada uno como un nombre".xargsconviertestdinen argumentos de comando. En cierto modo, es lo contrario deecho, lo que convierte sus argumentos enstdout. La diferencia entrefind ... | xargs -n1 basenameofind ... | xargs basename -ayfind ... | basenamees que los dos primeros funcionarán con implementaciones debasenameese ignorarstdin.Prueba esto:
fuente
findcomando, por lo que solo lo uso para buscar y enumerar archivos, y uso xargs para todo lo demás.basename solo acepta un único argumento. El uso
-execfunciona correctamente porque cada uno{}se reemplaza por el nombre de archivo actual que se está procesando y el comando se ejecuta una vez por archivo coincidente , en lugar de intentar enviar todos los argumentos a basename de una sola vez.fuente
xargspuede ser forzado a pasar un argumento también ...find . -name '*.deb' -print | xargs -n1 basenameEsto funciona, sin embargo, la respuesta aceptada se utiliza
findde una manera más adecuada. Encontré esta pregunta buscandoxargs basenameproblemas ya que estoy usando otro comando para obtener una lista de ubicaciones de archivos. La-n1bandera dexargsfue la respuesta definitiva para mí.fuente