본문 바로가기
카테고리 없음

find 명령어, -print와 -prune을 함께 쓸 때 주의할 점

by IT트레이서 2025. 8. 11.

find 명령어, -print와 -prune을 함께 쓸 때 주의할 점

리눅스 find 명령어는 강력하지만, 옵션의 순서와 조합에 따라 예상치 못한 결과를 낳기도 합니다. 특히 **-print**와 -prune 옵션을 함께 사용할 때 종종 혼동이 발생합니다. 오늘 이 글에서는 두 옵션의 미묘한 차이와 올바른 사용법을 간단히 정리해 보겠습니다.


핵심 요약: find의 -print는 조건의 끝에!

find는 조건을 왼쪽에서 오른쪽으로 순차적으로 평가합니다. 여기서 중요한 규칙은 다음과 같습니다.

  • find 명령어에 명시적인 액션 옵션(-print, -exec 등)이 없으면 find는 모든 참(true)인 결과에 대해 기본적으로 -print를 실행합니다.
  • 액션 옵션이 하나라도 명시적으로 존재하면, find는 기본 -print를 사용하지 않고, 오직 명시된 위치의 액션만 실행합니다.

이 규칙을 바탕으로 두 가지 상황을 비교해 보겠습니다.

1. -print가 명시적으로 있을 때 (조건의 끝에)

Bash
 
find . -type d -name "unittest" -prune -o -type d -name "test*" -print

이 명령어는 unittest 디렉터리를 찾으면 prune 옵션으로 하위 탐색을 중단하고, -o 뒤의 조건절을 평가하지 않습니다. 그리고 o 연산자 뒤에 있는 -print는 실행되지 않기 때문에 unittest 디렉터리는 출력되지 않습니다. 그 결과, unittest를 제외한 test 관련 디렉터리만 출력됩니다.

2. -print가 없을 때 (기본 액션 사용)

Bash
 
find . -type d -name "unittest" -prune -o -type d -name "test*"

이 명령어는 -print와 같은 명시적인 액션 옵션이 없습니다. 따라서 find는 전체 표현식의 끝에 -print가 있는 것처럼 동작합니다.

  • unittest 디렉터리를 찾으면: -prune이 실행되어 탐색은 중단됩니다. 하지만 unittest 디렉터리는 이 표현식을 참(true)으로 만들었기 때문에, 기본 -print 액션에 의해 경로가 출력됩니다.
  • test 관련 디렉터리를 찾으면: -o 뒤의 조건이 참이 되어 경로가 출력됩니다.

결과적으로, 이 명령어는 unittest 디렉터리를 포함한 모든 test 관련 디렉터리를 출력합니다.

 

 


정리하면:

  • unittest를 출력에서 제외하고 싶다면: unittest를 찾는 조건 뒤에 -prune을 두고, -print는 o 연산자 뒤의 조건에만 붙여주세요. find . -type d -name unittest -prune -o -type d -name "test*" -print
  • unittest도 출력하고 싶다면: -print를 명시적으로 쓰지 않고, find의 기본 동작을 활용하세요. find . -type d -name unittest -prune -o -type d -name "test*"

find 명령어의 작동 원리를 이해하면 디렉터리 관리 스크립트를 작성할 때 불필요한 실수를 줄일 수 있습니다. 이 글이 여러분의 개발 작업에 도움이 되기를 바랍니다! 😊