Domanda
Nota:
# cat / tmp / foo
- file normale
/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib
cat / tmp / foo | xargs cp / tmp / fred
cp: target /lib/d.lib non è una directory
Soluzione
xargs normalmente colloca gli args sostituiti per ultimi. Potresti semplicemente fare:
$ cp `cat /tmp/foo` /tmp/fred/.
Se sono davvero solo i file lib, allora cp /lib/?.lib / tmp / fred /.
funzionerebbe naturalmente.
E per farlo davvero con xargs
, ecco un esempio per mettere al primo posto l'arg:
0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$
Altri suggerimenti
La tua versione di xargs probabilmente accetta -I
:
xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
Supponendo che / tmp / fred
sia una directory, specificala usando -t
( --target-directory
):
$ cat /tmp/foo | xargs cp -t /tmp/fred
Perché non provare qualcosa del genere:
cp /lib/*.lib /tmp/fred
Penso che il tuo comando stia fallendo perché xargs crea il seguente comando:
cp /tmp/fred /lib/a.lib /lib/b.lib /lib/c.lib /lib/d.lib
Cioè, finisce per provare a copiare tutto in /lib/d.lib, che non è una directory, quindi il tuo messaggio di errore.
La directory di destinazione deve essere l'ultima cosa sulla riga di comando, tuttavia xargs
aggiunge stdin alla fine della riga di comando, quindi nel tuo tentativo finisce come primo argomento.
Potresti aggiungere la destinazione a / tmp / foo prima di usare xargs o usare cat in backtick per interpolare i file sorce prima della destinazione:
cp `cat /tmp/foo` /tmp/fred/
Supponendo che / tmp / fred sia una directory esistente, è possibile utilizzare un ciclo while
while read file
do
cp $file /tmp/fred
done < /tmp/foo
Come ha risposto Sinan & # 220; n & # 252; r
cat /tmp/foo | xargs cp -t /tmp/fred
se nessun supporto -t
( cat /tmp/foo; echo /tmp/fred ) | xargs cp