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 ?

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")' - {}

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

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

Danke für die Antwort. Das hat wie ein Zauber gewirkt. aber wie kann ich einen Unterbefehl innerhalb der xargs ausführen?
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.