Comment utiliser cp depuis stdin?
Question
Remarque:
# cat / tmp / foo
- fichier normal
/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib
cat / tmp / foo | xargs cp / tmp / fred
cp: la cible /lib/d.lib n'est pas un répertoire
La solution
xargs place normalement ses arguments substitués en dernier. Vous pouvez juste faire:
$ cp `cat /tmp/foo` /tmp/fred/.
S'il ne s'agit que des fichiers lib, cp /lib/?.lib / tmp / fred /.
fonctionnerait naturellement.
Et pour le faire vraiment avec xargs
, voici un exemple d'utilisation de l'argument en premier:
0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$
Autres conseils
Votre version de xargs accepte probablement -I
:
xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
En supposant que / tmp / fred
est un répertoire, spécifiez-le à l'aide de l'option -t
( - répertoire-cible
):
$ cat /tmp/foo | xargs cp -t /tmp/fred
Pourquoi ne pas essayer quelque chose comme:
cp /lib/*.lib /tmp/fred
Je pense que votre commande échoue car xargs crée la commande suivante:
cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib
C’est-à-dire qu’il finit par essayer de tout copier dans /lib/d.lib, ce qui n’est pas un répertoire, d’où votre message d’erreur.
Le répertoire de destination doit être la dernière chose de la ligne de commande. Toutefois, xargs
ajoute stdin à la fin de la ligne de commande, de sorte que, dans votre tentative, il se transforme en premier argument.
Vous pouvez ajouter la destination à / tmp / foo avant d'utiliser xargs, ou utiliser cat dans les backticks pour interpoler les fichiers Sorce avant la destination:
cp `cat /tmp/foo` /tmp/fred/
En supposant que / tmp / fred est un répertoire qui existe, vous pouvez utiliser une boucle while
while read file
do
cp $file /tmp/fred
done < /tmp/foo
Répondez par Sinan & # 220; n & # 252; r
cat /tmp/foo | xargs cp -t /tmp/fred
si pas de soutien -t
( cat /tmp/foo; echo /tmp/fred ) | xargs cp