Führen Sie den Unterbefehl in xargs aus

7

Ich möchte einen Softlink aller Binärdateien von Ordner A zu Ordner B erstellen, wie z.

find /home/A/bin/* -print | xargs -I {} ln -sf {} /tmp/B/$(basename {})

Das Problem ist, dass ich keinen Unterbefehl innerhalb der xargs ausführen kann.

was sollte ich tun ?

Glenn Jackman
quelle

Antworten:

8

Das Starten einer Subshell macht das, was Sie wollen:

find /home/A/bin/* -print |
xargs -I {} sh -c 'ln -sf "$1" /tmp/B/$(basename "$1")' - {}
Glenn Jackman
quelle
Dies ist die eigentliche Antwort auf die Frage. @alinsoar hat vielleicht einen besseren Weg gezeigt, um das zu tun, was das OP wollte, aber so tun Sie, was er verlangt hat.
ACK_stoverflow
Müssen einige der $s entkommen?
Fund Monica Klage
Nein, da sie alle in einfachen Anführungszeichen stehen. Sie werden erst erweitert, wenn shsie ausgeführt werden.
Glenn Jackman
5
mkdir A ; touch A/file1 ; touch A/file2
mkdir B
for i in `ls A`; do ln -sf $PWD/A/$i B/; done
Amir Naghizadeh
quelle
3

Sie können direkt ausführen ln -sf /h/a/bin/* /tmp.

Oder Sie können zu / tmp gehen und dies tun:

cd /tmp
ln -sf /home/A/bin/*

Verwenden von xargs:

cd /tmp
find /home/A/bin/* -print0 | xargs -0 ln

quelle
Danke für die Antwort. Das hat wie ein Zauber gewirkt. aber wie kann ich einen Unterbefehl innerhalb der xargs ausführen?