كيفية استخدام حزب المحافظين من stdin؟
سؤال
ملحوظة:
# cat /tmp/foo
- regular file
/lib/a.lib
/lib/b.lib
/lib/c.lib
/lib/d.lib
cat /tmp/foo | xargs cp /tmp/fred
حزب المحافظين:الهدف /lib/d.lib ليس دليلاً
المحلول
عادةً ما يضع 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:~$
نصائح أخرى
ربما يقبل إصدار 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 في علامات الظهر لاستكمال ملفات المصدر قبل الوجهة:
cp `cat /tmp/foo` /tmp/fred/
بافتراض أن /tmp/fred هو دليل موجود، فيمكنك استخدام حلقة while
while read file
do
cp $file /tmp/fred
done < /tmp/foo
كما أجاب سنان أونور
cat /tmp/foo | xargs cp -t /tmp/fred
إذا لم يكن هناك دعم -t
( cat /tmp/foo; echo /tmp/fred ) | xargs cp