Вопрос

Примечание:

# 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 не является каталогом

Это было полезно?

Решение

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

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

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

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

0:~$ (echo word1; echo word2) | xargs -I here echo here how now
word1 how now
word2 how now
0:~$ 

Другие советы

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

xargs -I FOO cp FOO /tmp/fred/ < /tmp/foo

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

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

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

cp /lib/*.lib /tmp/fred

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

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

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

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

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

    cp `cat /tmp/foo` /tmp/fred/

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

while read file
do
    cp $file /tmp/fred
done < /tmp/foo

Как ответил Синан & n # 220; n & # 252; r

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

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

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top