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
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