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
xargs
es 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
?-a
opción: "admite múltiples argumentos y trata cada uno como un nombre".xargs
conviertestdin
en argumentos de comando. En cierto modo, es lo contrario deecho
, lo que convierte sus argumentos enstdout
. La diferencia entrefind ... | xargs -n1 basename
ofind ... | xargs basename -a
yfind ... | basename
es que los dos primeros funcionarán con implementaciones debasename
ese ignorarstdin
.Prueba esto:
fuente
find
comando, 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
-exec
funciona 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
xargs
puede ser forzado a pasar un argumento también ...find . -name '*.deb' -print | xargs -n1 basename
Esto funciona, sin embargo, la respuesta aceptada se utiliza
find
de una manera más adecuada. Encontré esta pregunta buscandoxargs basename
problemas ya que estoy usando otro comando para obtener una lista de ubicaciones de archivos. La-n1
bandera dexargs
fue la respuesta definitiva para mí.fuente