find 명령이 예상 결과를 반환하지 않을까요? 해결 방법은 다음과 같습니다

Unix 기반 시스템에서 find 명령을 실행해 본 적이 있다면, 명령이 존재하는 파일을 찾지 못하는 실망스러운 상황을 겪었을 수 있습니다. 예를 들어, 셸 스크립트 파일을 검색하고 싶지만, 그것들이 존재한다고 확신했음에도 출력이 비어 있는 경우가 있습니다. 이 일반적인 문제는 종종 find 명령이 와일드카드 문자를 해석하는 방법에 대한 잘못된 이해에서 발생합니다. 문제를 깊이 파악하고 검색을 올바르게 진행할 수 있는 솔루션을 찾아봅시다.

문제: find가 예상대로 작동하지 않음

당신이 시도했을 수 있는 이 명령을 고려해 보십시오:

$ find /usr -name *.sh

이 명령은 /usr 디렉토리에서 .sh 확장자를 가진 모든 파일을 검색하는 것을 목표로 합니다. 그러나 결과가 나타나지 않는다면, find가 작동하지 않는 것일까요?

스크립트가 그곳에 존재한다는 것을 알고 있습니다; 예를 들어, 다음 명령을 실행할 때:

$ ls /usr/local/lib/*.sh

tclConfig.shtkConfig.sh 같은 파일을 볼 수 있습니다. 그렇다면 find 명령에 무슨 문제가 있는 걸까요?

문제 이해하기

주요 문제는 커맨드 셸이 와일드카드 *.sh를 해석하는 방식입니다. 특히, 현재 디렉토리에 *.sh와 일치하는 파일이 있을 경우, 셸은 find가 그것을 처리할 기회도 주지 않고 해당 와일드카드를 확장해 버립니다. 이로 인해 예상치 못한 동작이 발생할 수 있습니다:

  1. 와일드카드 확장

    • 현재 디렉토리에 .sh 파일이 존재하는 경우, 예를 들어 tkConfig.sh, find /usr -name *.sh라고 입력하면 find /usr -name tkConfig.sh로 확장되므로 검색이 그 파일로만 제한됩니다.
  2. 문법 오류

    • 여러 파일이 일치할 경우, find는 모호한 인수로 인해 문법 오류를 발생시킬 수 있습니다:
      find: bad option tkConfig.sh
      

솔루션 1: 와일드카드 따옴표로 묶기

셸이 와일드카드를 find에 전달하기 전에 확장하지 못하도록 하려면, 와일드카드 문자를 따옴표로 묶어야 합니다:

  • 이중 따옴표 사용:
    $ find /usr -name "*.sh"
    
  • 또는 단일 따옴표 사용:
    $ find /usr -name '*.sh'
    

*.sh를 따옴표로 묶음으로써, 셸에게 그것을 있는 그대로 find에 전달하도록 지시하여 지정된 디렉토리에서 모든 .sh 파일을 찾을 수 있습니다.

솔루션 2: 심볼릭 링크 따라가기

find가 예상대로 작동하지 않는 또 다른 가능한 이유는 /usr 디렉토리 또는 그 하위 디렉토리에 심볼릭 링크가 존재하는 것입니다. 기본적으로 find는 심볼릭 링크를 따르지 않습니다. 이 경우를 의심한다면, -follow 옵션을 사용할 수 있습니다:

$ find /usr -follow -name '*.sh'

이 명령은 find가 심볼릭 링크를 탐색하고 원하는 파일을 찾을 수 있도록 합니다.

결론

요약하자면, 셸 스크립트를 검색할 때 find 명령이 예상한 결과를 생성하지 않는다면, 이는 와일드카드 확장이나 심볼릭 링크의 존재 때문일 가능성이 높습니다. 예방 조치로 항상 와일드카드를 따옴표로 묶어 조기 확장을 방지하고, 필요시 -follow 옵션을 사용하세요. 이러한 전략을 사용하여 셸 스크립트를 성공적으로 찾고 명령줄 실력을 향상시킬 수 있습니다!

행복한 검색 되세요!

이제 find 명령을 자신 있게 사용할 준비가 되었습니다! 질문이나 추가 문제가 있다면, 아래 댓글에 자유롭게 남겨주세요.