user@debian:~/test/B$ find ..
..
../A
../A/x
../A/y
../A/z
../B
user@debian:~/test/B$ find ../A -type f -print0 |xargs -0 -i% realpath --relative-to=../A %
x
y
z
user@debian:~/test/B$ # But
user@debian:~/test/B$ find ../A -type f -print0 |xargs -0 -i% echo $(realpath --relative-to=../A %)
../B/../A/x
../B/../A/y
../B/../A/z
ムルは「という質問に対する答えを提案します。basenameで-execコマンドオプションを見つける「おそらく質問に答えます。しかし、私はfind
withを使用しません-exec
。
realpath
私はmuruの説明「コマンドの置き換えは実行を開始する前にシェルによって実行されますxargs
(xargs
引数が何であるかを評価するステップとして)」を理解していません。
realpath --relative-to=../A
電話する前にどのように評価しますかxargs
?- 評価をしてもその評価結果は何であり、なぜ他の出力が出るのでしょうか?
答え1
説明する
私の答えを案内してくれた@muruに感謝します。現在の状況は次のとおりです。
シェルがコマンドラインを表示するとき
find ../A -type f -print0 |xargs -0 -i% echo $(realpath --relative-to=../A %)
まず、コマンド置換を評価します。
realpath --relative-to=../A %
評価結果はです../B/%
。
したがって、起動時に実行する有効なコマンドは次のとおりfind
です。
find ../A -type f -print0 |xargs -0 -i% echo ../B/%
realpath
...まったく呼び出さずにfind
出力を../B/
。
解決策
そこでコマンド置換を使用しないでください。realpath
目的のタスクを実行する前に、通常を使用してそのタスクを実行します(この例ではあまりありませんが、明らかに拡張できます)。
find ../A -type f -print0 |xargs -0 -i% realpath -z --relative-to=../A % |xargs -0 -i% echo %