Pregunta

Nota:

# cat / tmp / foo - archivo regular

/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib

cat / tmp / foo | xargs cp / tmp / fred

cp: target /lib/d.lib no es un directorio

¿Fue útil?

Solución

xargs normalmente coloca sus args sustituidos en último lugar. Usted podría simplemente hacer:

$ cp `cat /tmp/foo` /tmp/fred/.

Si realmente son solo los archivos lib, entonces cp /lib/?.lib / tmp / fred /. funcionaría naturalmente.

Y para hacerlo realmente con xargs , aquí hay un ejemplo de poner el argumento primero:

0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$ 

Otros consejos

Su versión de xargs probablemente acepta -I :

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo

Suponiendo que / tmp / fred es un directorio, especifíquelo utilizando la opción -t ( --target-directory ):

$ cat /tmp/foo | xargs cp -t /tmp/fred

¿Por qué no probar algo como:

cp /lib/*.lib /tmp/fred

Creo que tu comando está fallando porque xargs crea el siguiente comando:

cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib

Es decir, termina intentando copiar todo a /lib/d.lib, que no es un directorio, de ahí su mensaje de error.

El directorio de destino debe ser lo último en la línea de comandos, sin embargo, xargs agrega stdin al final de la línea de comandos, por lo que en su intento termina como el primer argumento.

Puede añadir el destino a / tmp / foo antes de usar xargs, o usar cat en backticks para interpolar los archivos de sorce antes del destino:

    cp `cat /tmp/foo` /tmp/fred/

Suponiendo que / tmp / fred es un directorio que existe, puede usar un bucle while

while read file
do
    cp $file /tmp/fred
done < /tmp/foo

Respondido por Sinan Ünür

cat /tmp/foo | xargs cp -t /tmp/fred

si no hay soporte

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top