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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top