Frage

Hinweis:

# cat /tmp/foo - reguläre Datei

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

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

cp: Ziel /lib/d.lib ist kein Verzeichnis

War es hilfreich?

Lösung

xargs normalerweise stellt seine args zuletzt ersetzt. Sie könnten nur tun:

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

Wenn es wirklich nur die LIB-Dateien ist, dann würde cp /lib/?.lib /tmp/fred/. natürlich arbeiten.

Und wirklich tut es mit xargs, hier ist ein Beispiel für die ARG erste Stelle zu setzen:

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

Andere Tipps

Ihre Version von xargs wahrscheinlich akzeptiert -I:

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

Unter der Annahme, /tmp/fred ist ein Verzeichnis, geben sie die -t (--target-directory Option) mit:

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

Warum nicht versuchen, so etwas wie:

cp /lib/*.lib /tmp/fred

Ich denke, Ihr Befehl fehlschlägt, weil xargs den folgenden Befehl erstellt:

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

Das heißt, es endet zu versuchen, alles zu kopieren, /lib/d.lib, die kein Verzeichnis ist, damit Ihre Fehlermeldung an.

Das Zielverzeichnis das letzte, was auf der Kommandozeile sein muss, aber xargs stdin an das Ende der Befehlszeile anhängt so in Ihrem Versuch, es als erstes Argument endet.

Sie können das Ziel zu / tmp / foo anhängen, bevor xargs, oder verwenden Sie Katze in Backticks mit den sorce Dateien vor dem Ziel zu interpolieren:

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

Unter der Annahme / tmp / fred ist ein Verzeichnis, das vorhanden ist, können Sie eine while-Schleife verwenden könnte

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

Wie beantwortet von Sinan Unur

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

, wenn keine -t Unterstützung

( cat /tmp/foo; echo /tmp/fred ) | xargs cp
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top