[완료] find -exec 에서 basename 결과가 이상합니다.
글쓴이: nomail / 작성시간: 수, 2014/02/05 - 10:33오후
find 결과로 어떤 처리를 할려고 하는데요.
-exec에서 basename을 실행하면 엉뚱한 결과가 나와의 문의드립니다.
find . -exec echo $(realpath {}) \; find . -exec echo $(basename {}) \;
첫번째 realpath는 정상적으로 전체경로가 나오구요
두번째 basename에서는 파일명만 나와서 하는데 결과값 그대로 나옵니다.
echo 없이 basename {} 이렇게 하면 정상적으로 나옵니다만 echo를 꼭 넣어야 하는 상황이라서요.
혹시 해결방법이 없을까요?
Forums:
find . -exec echo $(realpath
$(realpath {}) 이 부분은 쉘에서 해석하는 확장 문법입니다. 대표적으로 sh, bash에서 지원하는 문법 입니다. 이 얘기는 find가 실행되기 전 쉘에서 $( ... ) 부분을 처리해서 결과를 대치한 후 find가 실행 된다는 뜻 입니다. -exec가 반복적으로 실행될 때 이미 $( ... ) 이 부분은 쉘에서 대치한 결과물로 바뀌어진 상태 입니다.
쉘에서 realpath {} 한 번 입력해 보세요 글자 그대로.
이런식으로 나올 겁니다. realpath에 전달된 파일 이름이 존재하지 않을 경우 현재 디렉토리에 주어진 이름을 덧붙여 출력하는 것이 기본 동작인 것 같습니다. {} 이 부분을 그냥 문자열로 처리합니다. 그러면 실제로 find가 실행될 때 전달되는 내용은,
이렇게 됩니다. 근데 여전히 {} 부분은 find -exec에게는 유효한 의미있는 문자 입니다. 그래서,
이렇게 모든 파일에 대해서 echo가 실행 됩니다.
이런식으로 나오겠죠. 정상적으로 출력이 되셨다고는 했으나 다시 한번 살펴보시면 뭔가 이상한 부분이 있을 겁니다. realpath의 결과물은 다음과 같이 나오겠죠.
basename도 마찬가지 입니다.
원하시는 결과는 이렇게 써야 할 것 같습니다.
작은 따옴표를 쓴 것에 주의 하세요. 여기서 큰 따옴표를 쓰면 또 쉘이 가로 챕니다.
dontdieych님 도움 주셔서 정말
dontdieych님 도움 주셔서 정말 고맙습니다.
대충 힌트 정도만이라도 기대했는데 자세하게 설명해주셔서 문제를 쉽게 해결했습니다.
질문 올리고 나서도 해결이 안되어 결국 find결과를 한줄씩 읽어 반복문으로 처리했는데요.
확장문법이 명령 실행되는 시점에 해석된다는 생각을 왜 못한건지..ㅜㅜ
알려주신 대로 realpath도 이상하게 나오는게 맞습니다.
단순히 경로만 확인했는데 정확한 결과가 아니었네요.
덕분에 find랑 같이 오늘 공부 많이 했습니다. 정말 고맙습니다^^
댓글 달기