[완료] find -exec 에서 basename 결과가 이상합니다.

nomail의 이미지

find 결과로 어떤 처리를 할려고 하는데요.
-exec에서 basename을 실행하면 엉뚱한 결과가 나와의 문의드립니다.

find . -exec echo $(realpath {}) \; 
find . -exec echo $(basename {}) \; 

첫번째 realpath는 정상적으로 전체경로가 나오구요
두번째 basename에서는 파일명만 나와서 하는데 결과값 그대로 나옵니다.

echo 없이 basename {} 이렇게 하면 정상적으로 나옵니다만 echo를 꼭 넣어야 하는 상황이라서요.
혹시 해결방법이 없을까요?

dontdieych의 이미지

find . -exec echo $(realpath {}) \; 

$(realpath {}) 이 부분은 쉘에서 해석하는 확장 문법입니다. 대표적으로 sh, bash에서 지원하는 문법 입니다. 이 얘기는 find가 실행되기 전 쉘에서 $( ... ) 부분을 처리해서 결과를 대치한 후 find가 실행 된다는 뜻 입니다. -exec가 반복적으로 실행될 때 이미 $( ... ) 이 부분은 쉘에서 대치한 결과물로 바뀌어진 상태 입니다.

쉘에서 realpath {} 한 번 입력해 보세요 글자 그대로.

$ realpath {}
/tmp/find/{}

이런식으로 나올 겁니다. realpath에 전달된 파일 이름이 존재하지 않을 경우 현재 디렉토리에 주어진 이름을 덧붙여 출력하는 것이 기본 동작인 것 같습니다. {} 이 부분을 그냥 문자열로 처리합니다. 그러면 실제로 find가 실행될 때 전달되는 내용은,

find . -exec echo /tmp/find/{} \; 

이렇게 됩니다. 근데 여전히 {} 부분은 find -exec에게는 유효한 의미있는 문자 입니다. 그래서,

echo /tmp/find/찾은파일

이렇게 모든 파일에 대해서 echo가 실행 됩니다.

/tmp/find/.
/tmp/find/./11
/tmp/find/./3
/tmp/find/./3/3
/tmp/find/./2
/tmp/find/./2/2
/tmp/find/./1
/tmp/find/./1/1

이런식으로 나오겠죠. 정상적으로 출력이 되셨다고는 했으나 다시 한번 살펴보시면 뭔가 이상한 부분이 있을 겁니다. realpath의 결과물은 다음과 같이 나오겠죠.

$ realpath /tmp/find/./1/1
/tmp/find/1/1

basename도 마찬가지 입니다.

$ basename {}
{}

find . -exec echo $(basename {}) \; 
find . -exec echo {} \; <--쉘에서 처리 후,
echo 찾은파일 <- -exec가 수행하는 부분

원하시는 결과는 이렇게 써야 할 것 같습니다.

find . -exec sh -c 'echo $(basename {})' \;

작은 따옴표를 쓴 것에 주의 하세요. 여기서 큰 따옴표를 쓰면 또 쉘이 가로 챕니다.

nomail의 이미지

dontdieych님 도움 주셔서 정말 고맙습니다.
대충 힌트 정도만이라도 기대했는데 자세하게 설명해주셔서 문제를 쉽게 해결했습니다.
질문 올리고 나서도 해결이 안되어 결국 find결과를 한줄씩 읽어 반복문으로 처리했는데요.
확장문법이 명령 실행되는 시점에 해석된다는 생각을 왜 못한건지..ㅜㅜ
알려주신 대로 realpath도 이상하게 나오는게 맞습니다.
단순히 경로만 확인했는데 정확한 결과가 아니었네요.
덕분에 find랑 같이 오늘 공부 많이 했습니다. 정말 고맙습니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.