Как использовать cp из stdin? - PullRequest
       52

Как использовать cp из stdin?

3 голосов
/ 23 октября 2009

Примечание:

# cat /tmp/foo - обычный файл

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

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

cp: target /lib/d.lib не является каталогом

Ответы [ 7 ]

10 голосов
/ 23 октября 2009

xargs обычно ставит свои замещенные аргументы последними. Вы можете просто сделать:

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

Если это действительно просто файлы lib, тогда cp /lib/?.lib /tmp/fred/. будет работать нормально.

И чтобы действительно сделать это с xargs, вот пример размещения аргумента:

0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$ 
2 голосов
/ 23 октября 2009

Ваша версия xargs, вероятно, принимает -I:

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo
2 голосов
/ 23 октября 2009

Предполагая, что /tmp/fred является каталогом, укажите его, используя -t (--target-directory опция):

$ cat /tmp/foo | xargs cp -t /tmp/fred
0 голосов
/ 27 июля 2015

Как ответил Синан Юнюр

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

если нет -t поддержка

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
0 голосов
/ 23 октября 2009

Предполагая, что / tmp / fred является существующим каталогом, вы можете использовать цикл while

while read file
do
    cp $file /tmp/fred
done < /tmp/foo
0 голосов
/ 23 октября 2009

Каталог назначения должен быть последним в командной строке, однако xargs добавляет stdin в конец командной строки, поэтому при вашей попытке он заканчивается в качестве первого аргумента.

Вы можете добавить пункт назначения в / tmp / foo перед использованием xargs, или использовать cat в обратных галочках для интерполяции файлов sorce до пункта назначения:

    cp `cat /tmp/foo` /tmp/fred/
0 голосов
/ 23 октября 2009

Почему бы не попробовать что-то вроде:

cp /lib/*.lib /tmp/fred

Я думаю, что ваша команда не работает, потому что xargs создает следующую команду:

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

То есть он пытается скопировать все в /lib/d.lib, который не является каталогом, следовательно, ваше сообщение об ошибке.

...