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 %