Как использовать cp из stdin?
Вопрос
Примечание:
# 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