Wie cp verwenden von stdin?
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
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