سؤال

ملحوظة:

# 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top