김현우
  • 리눅스 한 학기 살기 - 10주차
    2025년 05월 28일 20시 12분 18초에 업로드 된 글입니다.
    작성자: kugorang
    728x90
    728x90

    들어가며

    자료구조의 tree를 언급하는 글은 아니다

     

    이번 주차의 글은 tree이다. 보통 파일 계층 구조를 나타낼 때 아스키코드 문자를 많이 활용하는데 여태 일일히 하나씩 표현했던 내가 참 바보 같다는 생각이 들게 해준 고마운 라이브러리이다. 이제부터 tree에 대해 알아보자.

     

    tree 명령 개요와 주요 기능

    tree디렉터리 구조를 트리 형태로 시각화해주는 리눅스 명령어다. 일반적인 ls 명령이 파일과 폴더를 단순 나열하는 데 반해, tree는 계층적인 디렉터리-파일 종속 관계를 들여쓰기와 선 연결 문자로 보여줘서 복잡한 폴더 구조도 한눈에 이해할 수 있게 한다. 예를 들어 프로젝트의 폴더 구성이나 리눅스 시스템의 디렉터리 계층을 트리 형태로 출력하면, 디렉터리 간 포함 관계와 구조를 시각적으로 파악하기 쉽다. tree 명령을 실행하면 현재 디렉터리부터 시작하여 하위의 모든 디렉터리와 파일을 재귀적으로 탐색하며 목록을 작성한다. 출력의 각 행은 파일 또는 폴더 하나를 나타내며, 들여쓰기와 선으로 부모-자식 관계를 표현한다. 출력 마지막에는 총 디렉터리 수와 파일 수를 요약하여 알려주므로, 구조뿐 아니라 전체 항목 개수도 함께 파악할 수 있다.

     

    이 명령은 본래 MS-DOS 등의 환경에서 기원했으나, 현재는 리눅스를 포함한 다양한 플랫폼에서 사용된다. 특히 유닉스/리눅스용 tree는 Steve Baker가 개발한 오픈 소스 프로그램으로서, 대부분의 리눅스 배포판에서 패키지로 제공된다. 다만 기본 설치에 포함되지 않는 경우도 많아서 사용 전에 패키지 관리자를 통해 수동 설치해야 한다 (설치 방법은 본 글 후반에 설명). tree 명령은 별도의 옵션 없이 실행해도 현재 디렉터리의 전체 트리 구조를 출력하며, 사용 목적에 따라 여러 옵션으로 출력을 조정할 수 있는 작지만 강력한 도구다. 기본 동작만으로도 폴더 구조 학습이나 파일 구성 점검 등에 유용하며, 추가 옵션을 통해 숨김 파일 포함, 특정 깊이까지만 출력, 디렉터리만 선택 출력 등 다양한 형태로 활용 가능한 유연성을 갖추고 있다.

     

    내부 동작 방식 및 기술적 구조

    tree의 내부 작동은 전형적인 재귀적 디렉터리 순회 알고리즘으로 이루어진다. 프로그램이 시작되면 지정된 경로(인자를 생략하면 현재 디렉터리)에서 opendir() 등을 통해 디렉터리를 열고, readdir()를 호출하여 내부의 항목들을 순차적으로 읽어들인다. 이때 ... 항목은 무시하고, 기본 설정에서는 숨김 파일(이름이 .로 시작하는 파일)도 제외한다. 읽어들인 파일 및 하위 디렉터리 목록은 메모리에 저장한 후 알파벳 순으로 정렬하는데, 이는 사람이 보기 좋은 사전식 정렬을 통해 일관된 트리 출력을 제공하기 위함이다. 정렬에는 로캘(locale)을 고려한 비교가 이루어지며, 옵션에 따라 수정 시각이나 크기 등 다른 기준으로도 정렬할 수 있다 (자세한 옵션은 아래 CLI 인터페이스 분석 참조).

     

    각 디렉터리의 항목들을 정렬한 다음에는, 화면에 트리 구조로 출력하기 위해 현재 디렉터리 단계의 마지막 항목인지 여부를 판단하며 적절한 선 그래픽 문자를 붙여 파일/폴더 이름을 출력한다. 기본적으로 터미널이 UTF-8 등을 지원하면 수직 연결선(), 분기(├──), 마지막 항목 기호(└──) 등의 박스 드로잉 문자를 사용하고, 지원하지 않는 환경에서는 -A 옵션으로 ASCII |\ 등의 문자로 대체할 수도 있다. 출력 시 각 하위 디렉터리에 대해서는 재귀 호출을 통해 동일한 처리를 수행하되, 함수 호출 인자로 현재까지의 들여쓰기 상태(부모 디렉터리의 마지막 여부 등)를 전달하여 적절한 수직 연결선을 그리도록 한다. 이러한 방식으로 최상위부터 최하위 폴더까지 깊이 우선 탐색(DFS)이 이뤄지며, 스택 프레임 또는 재귀 호출 스택을 통해 자연스럽게 트리 형태 출력가 완성된다.

     

    한편, 파일 시스템 인터페이스 측면에서 tree는 POSIX API를 활용하여 구현된다. 각 디렉터리 내 항목의 종류를 판별하기 위해 lstat() 시스템 호출을 사용하여 파일 타입과 권한, 크기 등의 메타데이터를 얻고, 디렉터리인 경우 재귀적으로 내려가 탐색한다. 이 과정에서 심볼릭 링크를 만났을 때 특수 처리가 이루어지는데, 기본 동작으로는 링크 자체만 표시하고 링크 대상은 탐색하지 않는다. 그러나 -l 옵션이 주어지면 링크 대상이 디렉터리인 경우 실제 디렉터리처럼 따라 들어가서 그 내용까지 출력하며, 이때 순환 참조(loop)를 유발하는 심볼릭 링크는 감지 즉시 재귀를 멈추고 표시만 한다. 이렇게 함으로써 링크로 인해 무한 루프에 빠지지 않도록 안전장치를 갖추고 있다.

     

    정렬된 항목들을 출력하면서 tree는 내부적으로 파일과 디렉터리 개수를 누적 카운트한다. 재귀 탐색이 모두 완료되면 마지막에 "XX directories, YY files" 형식으로 총 디렉터리/파일 수를 요약해주는데, 이 요약 정보는 최종 출력 때 별도로 한 줄로 표시하거나 --noreport 옵션으로 생략할 수도 있다. 또한 tree출력 효율을 높이기 위해 한 디렉터리의 항목을 모두 메모리에 담아 처리하는데, 개발자 주석에 따르면 매우 거대한 디렉터리 트리를 다룰 때는 이러한 설계로 인해 많은 메모리를 소모할 수 있음을 밝히고 있다[^1]. 이는 정렬과 필터링 등 "옛 버전의 tree에선 불가능했던 기능들"을 구현하면서 생긴 트레이드오프로, 현대 시스템의 메모리에서는 큰 문제가 없지만 수십만 개 이상의 파일이 있는 경로를 트리로 출력할 경우 메모리 사용량이 증가할 수 있다. 요약하면 tree재귀적 디렉터리 순회 + 메모리 내 정렬 + 트리 형식 출력의 단순한 구조로 구현되었지만, 이러한 단순함이 오히려 성능과 가독성 면에서 뛰어난 결과를 만들어내는 핵심이다.

     

    CLI 인터페이스 상세 분석

    tree 명령은 다양한 옵션을 통해 출력 양식을 세밀하게 제어할 수 있다. 기본 명령만으로도 유용하지만, 옵션을 조합하면 특정 요구에 맞춘 형식으로 디렉터리 구조를 볼 수 있다. 아래에서는 자주 쓰이는 옵션들과 그 효과를 살펴보고, 여러 옵션을 조합한 사용 예시를 소개한다.

     

    주요 옵션과 사용 예시

    • 모든 파일 표시 (-a 또는 --all): 기본적으로 tree는 숨김 파일(점 .으로 시작하는 파일/디렉터리)을 무시하지만, -a를 붙이면 숨김 파일까지 포함한 전체 목록을 출력한다. 시스템 설정 폴더나 숨긴 리소스까지 구조를 봐야 할 때 유용하다.
    • 디렉터리만 표시 (-d 또는 --dirs-only): 이 옵션을 사용하면 파일은 제외하고 폴더 구조만 출력한다. 대용량 폴더에서 파일 목록을 일일이 보지 않고 폴더 체계만 훑어보거나, 교육용으로 폴더 계층을 강조하고 싶을 때 활용한다.
    • 깊이 제한 (-L <level>): 트리 출력의 최대 깊이(level)를 지정한다. 예를 들어 -L 2로 설정하면 현재 디렉터리 기준 2단계 아래까지의 하위 구조만 출력하고 그보다 깊은 내용은 생략한다. 폴더 구조가 너무 깊어 한 화면에 보기 어려울 때, 또는 상위 개요만 보고 싶을 때 유용하다. tree / -L 1과 같이 사용하면 리눅스 루트(/) 아래의 최상위 디렉터리들만 나열하여 전체 시스템의 주요 디렉터리를 한눈에 볼 수 있다[^2].
    • 전체 경로 표시 (-f 또는 --full-path): 파일 이름 앞에 해당 파일의 절대 경로를 모두 표시한다. 기본 출력은 트리 구조만 보여주기 때문에 깊은 경로의 파일은 이름만 보고 어디 위치인지 헷갈릴 수 있는데, -f 옵션으로 경로를 함께 보면 각 파일의 풀 경로를 정확히 알 수 있다. 이 옵션은 트리 출력 결과를 다른 스크립트에 넘길 때도 유용하며, 흔히 다음의 -i 옵션과 함께 쓰인다.
    • 들여쓰기 선 미표시 (-i): 트리 출력에서 가지 모양을 그리는 선(──, , , )을 그리지 않고 공백으로만 들여쓰기한다. -f처럼 경로 전체를 보여줄 때는 선 때문에 경로가 밀려 보이기 때문에, -i를 함께 사용하면 깔끔하게 경로 목록을 얻을 수 있다. 예를 들어 tree -fi를 사용하면 해당 디렉터리의 모든 파일 경로를 계층 구조 없이 한 줄씩 출력하는 효과가 있어서, 결과적으로 find 명령과 비슷한 출력이 되지만 여전히 tree의 패턴 필터 등의 장점을 활용할 수 있다.
    • 패턴 필터링 (-P <pattern> / -I <pattern>): 출력할 파일/디렉터리 이름에 와일드카드 패턴을 적용할 수 있다. -P는 지정한 패턴에 일치하는 이름만 표시하고, -I는 패턴에 일치하는 이름을 제외한다. 예를 들어 tree -P '*.c'는 C 소스파일(.c 확장자)만 트리로 보여주고 다른 파일은 생략하며, tree -I '__pycache__'는 파이썬 캐시 디렉터리를 제외한 구조를 출력한다. 여러 패턴을 -P 또는 -I 옵션으로 반복 지정할 수도 있어 복잡한 필터링이 가능하다. (단, 숨김 파일을 대상으로 패턴 매칭하려면 -a 옵션도 같이 써야 함에 유의.)
    • 정렬 옵션: 기본은 이름순 정렬이지만, -t 옵션을 사용하면 최종 수정 시각(timestamp) 순으로 정렬하여 최신 수정 파일을 위나 아래에 모아준다. -c 옵션은 inode 변경 시각(상태 변경 시각) 기준 정렬이며, -u 옵션은 최근 접근 시간(atime) 기준 정렬로 동작한다 (이때 -c-u는 단독으로 쓰기보다는 -t와 조합하여 각각 ctime이나 atime으로 정렬하는 용도로 쓰임). -r 옵션을 붙이면 정렬 결과를 역순으로 뒤집어 출력한다. 예를 들어 -t -r을 같이 쓰면 가장 오래된 수정 파일부터 출력된다. 또한 -v 옵션은 버전 번호가 섞인 이름을 자연 순서(예: file2file10보다 앞에 오도록)로 정렬해주며, --sort=size와 같이 사용하면 파일 크기 순으로도 정렬할 수 있다. 이러한 정렬 기능들은 ls에 비해 tree가 유연하게 구조 출력을 커스터마이즈할 수 있게 해주는 장점이다.
    • 메타데이터 표시: tree는 기본적으로 이름만 출력하지만, 몇 가지 옵션으로 각 항목의 상세 정보를 함께 보여줄 수 있다. -p 옵션을 사용하면 파일의 퍼미션(권한 비트)을 ls -l처럼 표시하고, -u 옵션은 소유자 사용자 이름(또는 UID), -g 옵션은 소유 그룹 이름(또는 GID)을 출력한다. -s를 붙이면 파일 크기(바이트)를 표시하고, -h (human-readable) 옵션까지 추가하면 크기를 KB, MB 등 사람이 읽기 좋은 단위로 바꿔준다. -D 옵션을 사용하면 마지막 수정 날짜/시간을 각 파일 옆에 표시해준다. 이들 옵션을 조합하면 ls -l과 유사하게 파일 상세 정보를 트리 구조와 함께 볼 수 있다. 예컨대 tree -pugsDh를 실행하면 권한(-p), 소유자(-u), 그룹(-g), 크기(-s, -h와 함께), 수정시각(-D)을 모두 포함한 트리 출력을 얻을 수 있다. 아래는 그러한 출력 예시다.

     

    $ tree -pugDh -L 1 /home/student
    /home/student
    ├── [drwxr-xr-x root   root    4.0K]  Documents
    ├── [drwxr-xr-x student students 4.0K]  Downloads
    ├── [drwxr-xr-x student students 4.0K]  Music
    └── [drwxr-xr-x student students 4.0K]  Pictures
    
    4 directories, 0 files

    위 예에서는 /home/student 아래 1단계 깊이(-L 1)의 폴더들을 -pugDh 옵션으로 출력했다. 각 항목에 대해 권한, 소유자, 그룹, 크기(인간 친화적 단위), 이름이 순서대로 보이며, 디렉터리는 대괄호 안에 표시되고 파일이었다면 크기 옆에 byte 단위나 KB 단위가 표시된다. 이처럼 tree는 단순 구조 시각화뿐만 아니라 파일 상세정보도 함께 제공할 수 있어 구조와 내용 정보를 한 번에 파악할 수도 있다.

    • 파일 타입 식별자 (-F): 출력된 이름 뒤에 파일 유형을 나타내는 문자를 붙여준다. 예를 들어 디렉터리명 뒤에는 /, 실행 파일(실행 권한 있는 파일) 뒤에는 *, 소켓 파일은 =, FIFO(named pipe)는 | 기호를 추가해서 한눈에 종류를 구분할 수 있다. ls의 -F 옵션과 유사한 역할이며, 트리 출력에서도 파일 종류를 빠르게 식별하고 싶을 때 사용한다.
    • 컬러 출력 제어 (-C, -n 등): tree는 ls와 마찬가지로 LS_COLORS 환경변수를 참조하여 터미널에 색상 출력을 할 수 있다. 기본 동작은 터미널 출력일 때 자동 색상 적용이고 파이프나 파일 리디렉션 시에는 컬러코드를 빼고 출력한다. -C 옵션은 강제로 색상을 켜서 파이프로 보내거나 파일에 저장할 때도 색 코드가 포함되게 하며, 반대로 -n 또는 --nocolor강제로 흑백 출력을 한다. 색상은 .dircolors 설정에 따라 디렉터리, 실행파일, 이미지파일 등 파일 종류별 색 구분이 되므로, 컬러 터미널에서는 가독성을 높여준다.

     

    다양한 출력 모드 (HTML/JSON 등)

    기본적으로 tree는 사람 눈에 읽기 좋은 텍스트 트리 구조를 출력하지만, 기계가 파싱하기 좋은 포맷으로도 출력 가능하다. 예를 들어 -X 옵션을 주면 XML 형식으로 출력하고, -J 옵션을 주면 JSON 형식의 배열 구조로 출력한다. 이러한 출력은 트리 결과를 다른 프로그램에서 읽어 후처리하거나 웹 서비스로 보내는 용도로 유용하다. 다만 XML/JSON 모드에서는 컬러 출력은 지원되지 않는다.

     

    또한 -H <URL> 옵션을 사용하면 HTML 형식 출력을 활성화할 수 있다. 이 모드에서는 생성된 트리 구조를 HTML 목록으로 출력하며, -T <title> 옵션으로 HTML 문서의 제목(title)이나 헤더를 지정할 수 있고, --charset 옵션으로 HTML에 사용할 문자 인코딩을 설정할 수 있다. HTML 출력 모드는 FTP 사이트의 디렉터리 listing 페이지를 생성하는 등 웹 환경에서 디렉터리 구조를 표시할 때 유용하며, -H 옵션의 인자로 기본 링크 경로(baseHREF)를 지정하면 각 디렉터리 항목이 해당 경로를 참조하는 하이퍼링크로도 동작한다. 예를 들어 tree -H "http://example.com/dir" -T "Index of /dir" -o tree.html /var/www/dir처럼 사용하면 /var/www/dir의 구조를 담은 HTML 파일을 생성할 수 있다. 이때 -o <파일명> 옵션으로 출력 결과를 지정한 파일로 저장할 수 있는데, 이 옵션은 HTML뿐 아니라 일반 텍스트 출력에도 적용 가능하여 트리 결과를 파일로 쉽게 저장할 수 있다. HTML 출력에서는 트리 선이 텍스트 기호로 그대로 나가기 때문에 보기 싫을 수 있어, 보통 -A 옵션(ANSI 그래픽 사용 안 함)도 같이 주는 것이 권장된다.

     

    정리하면, tree 명령은 다양한 옵션 조합을 통해 출력 형태를 커스터마이징할 수 있다. 간단한 예시로, 리눅스 시스템의 최상위 폴더 구조를 보고 싶다면 다음과 같이 실행한다.

    $ tree -A -d -L 2 -I proc /
    /                 <-- 루트 디렉터리
    ├── bin
    ├── boot
    ├── dev
    ├── etc
    │   ├── alternatives
    │   ├── cron.d
    │   └── ... (etc의 하위 디렉터리들)
    ├── home
    ├── lib
    ├── lib64
    ├── media
    ├── mnt
    ├── opt
    ├── [...] (중략)
    └── var

    위 명령은 / (루트)부터 디렉터리만 표시(-d)하되 깊이 2단계(-L 2)까지만 출력하고, proc 디렉터리를 제외(-I proc)했으며, ASCII 선그림 문자(-A)를 사용했다. 출력 결과 루트 아래 주요 디렉터리들이 보이고, etc 등의 2단계 하위 일부도 표시되어 있다. 이처럼 옵션 조합을 통해 원하는 부분만 추려내거나 형식을 바꾸어 볼 수 있어 활용도가 높다.

    728x90

    실제 사용 사례 및 교육 현장 활용

    tree 명령은 리눅스 입문자 교육과 실무 모두에서 유용한 도구로 사랑받고 있다. 아래에 대표적인 사용 사례와 교육 현장에서의 활용 방법을 정리한다.

    • 리눅스 파일시스템 학습: 리눅스 초보자들은 익숙하지 않은 디렉터리 구조 때문에 혼란을 느끼기 쉬운데, tree를 사용하면 전체 파일시스템 구조를 한눈에 보여줄 수 있어 이해를 돕는다. 예를 들어 강의 중에 tree -L 1 / 명령으로 루트 밑의 1단계 디렉터리들을 보여주고, 주요 디렉터리의 역할을 설명하는 식으로 활용할 수 있다. 실제로 Linux Foundation의 교육 자료에서도 tree를 활용해 리눅스 폴더 레이아웃을 보여주는데, 처음부터 전체를 다 보여주기보다는 -L 옵션으로 단계별로 펼쳐보이는 방법을 사용하고 있다[^2]. 이러한 방식은 학습자가 압도되지 않고 차근차근 구조를 익히는 데 도움이 된다.
    • 프로젝트 구조 문서화: 소프트웨어 프로젝트나 과제에서 폴더 구조를 문서화할 때 tree 출력이 널리 사용된다. 예를 들어 많은 오픈소스 프로젝트의 README나 개발 문서에 코드 파일 구조를 트리 형태로 보여주는데, 이는 실제 tree 명령 결과를 복사하거나 약간 편집한 것이다. 폴더와 파일들의 계층관계를 텍스트로 나열하는 것보다 트리 그림으로 제시하면 독자가 프로젝트 구성을 쉽게 파악할 수 있다. 교육자나 개발자 블로거들도 tree를 애용하는데, PHP 개발자인 Lorna Jane은 자신의 튜토리얼 글과 발표 슬라이드 등에 프로젝트 구조를 설명하기 위해 tree 명령 출력을 활용한다고 언급하였다[^3]. 그녀는 스크린샷 대신 텍스트 트리 구조를 사용하면 가독성이 높고 내용을 업데이트하기에도 수월하다고 강조한다. 이처럼 tree 출력은 문서 작성시에 프로젝트 폴더 구성이나 배포 파일 구성을 시각적으로 표현하는 용도로 많이 쓰인다.
    • 디렉터리 점검 및 관리: 서버 관리나 개발 작업 중에 어떤 디렉터리 아래에 생성된 파일들을 빠르게 점검해야 할 때 tree가 요긴하다. 예를 들어 빌드 결과물이 여러 폴더에 걸쳐 생성되는 경우, tree로 결과 디렉터리를 훑어보면서 의도한 위치에 파일들이 생성됐는지, 불필요한 파일은 없는지 한 번에 확인할 수 있다. 또한 여러 단계의 백업 폴더나 로그 폴더를 주기적으로 관리할 때, 깊은 경로를 일일이 찾아들어가기보다 tree로 전체 구조를 살펴본 후 필요 없는 부분을 정리하는 등의 작업이 효율적이다. 시스템 운영 시에도 tree를 사용하여 권한 설정이나 소유자 정보까지 함께 출력(-pug 옵션 등)하면 특정 디렉터리 이하의 퍼미션 구조를 한 화면에 점검할 수 있어 보안 설정 검토에 도움이 된다.
    • 교육 현장 실습: 리눅스 명령어 교육 시간에 tree는 재미있는 실습 도구가 될 수 있다. 예를 들어 학생들에게 여러 계층의 디렉터리를 만들고 파일을 분류하는 과제를 낸 다음, 각자가 만든 디렉터리 구조를 tree로 출력해보도록 하면 결과를 서로 비교하며 디렉터리 설계의 차이점을 토론할 수 있다. 또한 프로그래밍 수업에서 과제 제출물의 폴더 구조를 tree로 확인하게 함으로써, 학생들이 정해진 폴더 규칙을 잘 따라왔는지 자동으로 검사할 수도 있다. 한 Reddit 사용자 역시 "tree -A -d -L 2 -I proc / 명령을 사용하면 학생들이 리눅스 파일시스템을 더 잘 시각화할 수 있다"라고 조언하였는데[^4], 이처럼 tree는 _CLI 환경에서 시각적 피드백_을 주는 도구로 교육 현장에서 유용하게 쓰인다.
    • 문서 자동화 활용: tree는 스크립트에서 호출하여 그 출력 결과를 자동으로 문서에 포함시키는 방식으로 활용되기도 한다. 예를 들어 마크다운으로 프로젝트 문서를 작성할 때 tree 명령 출력으로 폴더 구조를 문서에 삽입하면, 프로젝트 변경 시 스크립트를 다시 실행하여 실제 디렉터리 구조에 맞게 문서 내용을 자동 갱신할 수 있다. Sphinx나 MkDocs 같은 문서화 도구에서도 빌드 과정 중에 tree를 실행해 결과를 포함하도록 구성할 수 있으며, 정적 사이트 생성 시에 최신 디렉터리 구조를 항상 반영하게 하는 용도로 쓰일 수 있다. 이러한 자동화는 특히 라이브러리 배포물 구조, 설정 파일 구조 등을 매뉴얼에서 관리할 때 사람 손으로 일일이 작성하는 수고를 덜어준다. (단, tree 출력 결과를 자동 반영할 때는 운영체제나 환경에 따라 디렉터리 구분자 표기 등 미세한 차이가 있을 수 있어 주의해야 한다.)

     

    이처럼 tree 명령은 학습용 시각화 도구에서부터 실무의 문서화/검증 도구까지 폭넓게 사용되고 있다. "한 그림이 천 마디 말을 대신한다"는 말처럼, 트리 텍스트 한 번으로 복잡한 구조를 설명할 수 있기 때문에 많은 개발자와 교육자가 tree를 애용하는 것이다.

     

    유명한 사용처 및 추천 사례

    tree는 그 유용성 때문에 여러 분야에서 적극 권장되거나 활용 사례가 보고되고 있다. 몇 가지 주목할 만한 예를 들면 다음과 같다.

    • 기술 블로그와 도서: 많은 기술 블로그 글이나 서적에서 예제 설명을 위해 tree 출력이 등장한다. 예를 들어 리눅스 파일시스템을 설명하는 블로그나 교재에서는 종종 tree/ 이하를 보여주며 디렉터리 소개를 하고, 웹 개발 관련 글에서는 프로젝트 스캐폴딩 구조를 tree로 제시하는 식이다. 이는 독자가 글만 읽을 때보다 구조를 시각적으로 이해하기 쉽게 해주며, 글쓴이가 의도한 폴더 구성대로 독자가 따라 했는지 검증하는 참고자료가 되기도 한다. 앞서 언급한 Lorna Jane의 경우처럼 기술 커뮤니티에서 tree를 알지 못했던 이들도 블로그를 통해 이 명령을 접하고 "유용하다"는 반응을 보이는 경우가 많았다[^3]. 따라서 입문자 대상의 책이나 튜토리얼에서는 tree 사용법을 함께 소개하는 경우도 있으며, 이를 통해 독자들이 자신의 실습 결과를 검토하도록 유도한다.
    • 개발 도구 및 플러그인: 텍스트 에디터나 IDE에서 디렉터리 트리 뷰를 제공하지만, 터미널 안에서 작업하는 개발자들은 간편히 구조를 보고 싶을 때 tree를 선호한다. 이런 수요 때문에 Emacs 등 일부 에디터에는 tree 명령의 출력을 에디터 버퍼로 불러와서 폴더 구조를 탐색하는 플러그인도 존재한다. 예를 들어 Emacs 사용자는 쉘 모드에서 tree를 실행하거나, 별도의 패키지를 통해 tree 결과를 인터랙티브하게 탐색할 수 있다. 또한 CI(지속적 통합) 파이프라인에서 배포 패키지의 내용 검증 단계에 tree 출력물을 로그에 남겨 사람이 나중에 구조를 쉽게 검토하도록 하는 사례도 있다. 이런 자동화된 환경에서는 tree -n으로 컬러를 끄고, -L로 깊이를 제한하여 로그 길이를 조절하는 등의 활용이 이루어진다.
    • 커뮤니티의 추천: 리눅스 Q&A 사이트나 포럼에서도 tree는 자주 언급된다. 한 예로 StackExchange_의 교육자 커뮤니티에서는 *"파일 시스템 개념을 가르칠 때 GUI보다는 터미널의 tree 명령이 디렉터리 구조를 명확히 보여주는 데 도움이 된다"_며 tree 사용을 권장하기도 했다[^5]. Reddit의 r/linux 게시판에서도 "터미널에서 tree를 사용하면 폴더 구조를 시각화하여 설명하기 좋다", "특정 디렉터리의 큰 그림을 볼 때 유용하다"는 등 긍정적 반응과 함께, newbie들에게 tree를 설치해서 써보라는 조언 글이 종종 눈에 띈다[^4]. 이러한 사용자 경험담은 tree가 단순한 유틸리티 이상으로 학습곡선을 완만하게 해주는 도구임을 보여준다.
    • 다른 플랫폼에서의 활용: 비록 본 주제가 리눅스이지만, 참고로 Windows에도 비슷한 tree 명령이 내장되어 있고, 맥OS에서도 brew install tree로 쉽게 설치하여 사용할 수 있다. 특히 Windows의 CMD나 PowerShell에서 tree를 실행하면 ASCII 문자로 구조를 출력하는데, 이를 기술 지원 사기에 악용하는 사례도 유명하다. 사기꾼이 피해자 컴퓨터에서 tree를 실행해 화면을 스크롤 가득 채운 다음, 마치 해킹을 막는 작업을 하는 것처럼 가장한다는 것인데, 역설적으로 이 일화는 tree 명령의 출력이 일반인에게도 "복잡한 컴퓨터 작업"으로 보일 정도로 임팩트가 있다는 반증이다. 물론 이러한 악용은 극단적 예시지만, 그만큼 tree의 출력이 시각적으로 인상적이며 구조 파악에 효과적임을 보여주는 사례라 하겠다.

     

    요약하면, tree"알아두면 쓸모 있는" 수준을 넘어 개발자와 교육자들에게 폭넓게 추천되는 필수 도구로 자리매김했다. CLI 환경에서 폴더 구조를 보는 한 가지 표준으로 통하며, 여러 활용 사례들이 커뮤니티를 통해 공유됨으로써 그 입지가 더욱 공고해지고 있다.

     

    대안 도구와의 비교

    tree 명령이 편리하긴 하지만, 비슷한 목적을 달성하는 다른 도구들도 존재한다. 여기서는 tree와 자주 비교되는 몇 가지 대안 CLI 도구들을 기능 측면에서 간략히 비교한다.

    • lsls -R: 가장 기본적인 대안은 ls 명령의 재귀 옵션(-R)을 사용하는 것이다. ls -R을 쓰면 하위 폴더까지 모두 나열할 수 있는데, 출력이 한 폴더씩 구분되어 순차적으로 열거될 뿐 트리 형태의 들여쓰기를 제공하지는 않는다. 예를 들어 ls -R은 각 디렉터리명을 헤더로 출력하고 그 안의 파일목록을 나열하는 식이라, 사람이 전체 구조를 직관적으로 파악하기 어렵다. 반면 tree는 선으로 계층을 연결하여 한 흐름 속에 보여주므로 시각적 구조 인지가 훨씬 용이하다. 또한 ls에는 디렉터리 자체에 대한 요약(총 몇 개의 파일/폴더인지) 기능이 없지만, tree는 마지막에 총 개수를 알려주는 이점도 있다. 다만 ls는 거의 모든 환경에 기본 설치되어 있고 출력 형식을 커스터마이즈(-1, -l, -F 등)할 수 있다는 강점이 있다. 요약하면 간단한 나열은 ls, 계층적 구조 파악은 tree로 쓰임새가 구분된다.
    • find: find 명령은 파일을 조건부로 검색하거나 재귀적으로 모든 파일 경로를 출력하는 만능 도구다. find . -print만 해도 현재 디렉터리부터 모든 경로를 풀패스로 출력하므로 tree와 유사하게 쓸 수 있다. 하지만 find의 출력은 이름순 정렬이 아니고, 기본적으로 경로 전체를 다 보여주기에 계층 구조를 눈으로 구분하기 어렵다 (출력 결과가 트리가 아니라 /로 구분된 경로 리스트다). 대신 find는 이름, 크기, 시간 등 여러 조건으로 필터링하거나 -exec로 후속 동작을 할 수 있어 스크립트 자동화 측면에서 강력한 장점이 있다. 한마디로 가독성은 tree, 유연한 검색은 find라 할 수 있다. 예를 들어 특정 확장자 파일만 찾을 때는 find가 더 좋지만, 그 결과 구조가 어떻게 되는지 한눈에 보고 싶다면 tree가 더 편리하다. 또한 find에는 출력 자체에 요약 정보가 없으므로, find로 나열한 뒤 별도로 wc -l 등을 해야 총 파일 개수를 알 수 있지만, tree는 바로 디렉터리/파일 수를 알려줘 편리하다는 차이도 있다.
    • du/ncdu: du는 디스크 사용량 확인을 위한 툴이지만 du -a를 쓰면 모든 파일 목록을 트리 순서대로 출력하는 효과가 있다. 그러나 du 출력은 각 항목의 크기에 초점이 맞춰져 있고, 트리 구조를 명확히 드러내진 못한다. 이 한계를 보완한 도구가 ncdu로, ncurses 기반의 터미널 UI에서 디렉터리별 용량을 트리 형태로 보여주며 인터랙티브하게 탐색할 수 있다. ncdu는 방향키로 트리 구조를 펼쳤다 접었다 하면서 용량별 정렬도 해볼 수 있어 디스크 정리에 유용하다. 반면 순수 트리 출력만 필요할 때는 과하므로, 용량 분석 목적이 아니라면 보통 tree가 더 간단하다. 종합하면 디스크 용량 분석용 트리 도구가 ncdu이고, 전반적인 구조 파악용 트리 도구가 tree라고 구분할 수 있다.
    • exa: exa는 Rust로 구현된 모던 ls 대체품으로, 컬러풀한 출력과 git 연동 정보 표시 등 향상된 기능을 제공한다. exa의 주된 기능은 ls 대체이지만 --tree 옵션을 통해 tree 명령과 유사한 트리 형식 출력을 지원한다. 예를 들어 exa --tree --level=2 명령을 실행하면 tree -L 2와 거의 비슷한 출력이 나오며, 파일 퍼미션이나 크기도 exa 옵션으로 함께 표시할 수 있다. exa의 장점은 기본적으로 컬러 및 아이콘 표시가 예쁘고, Git 저장소 내에서 --git-ignore 옵션 사용 시 .gitignore에 명시된 파일은 무시하고 출력할 수 있다는 점이다. 또한 파일 수정 시간이나 권한 등도 exa만의 스타일로 표시가 가능하다. tree 대비 단점이라면, exa는 아직 일부 세부 기능에서는 완성도가 완벽하지 않을 수 있고(예: 복잡한 패턴 필터링은 전용 옵션 부족) tree만큼 경량은 아니라는 것이다. 그래도 디렉터리 구조를 modern하게 출력하고 싶을 때 exa는 훌륭한 대안이며, 특히 이미 exa를 ls 대용으로 쓰고 있다면 별도 tree 설치 없이도 트리 보기를 할 수 있어서 편리하다.
    • broot: broot는 CLI에서 파일 탐색을 혁신적으로 향상시키기 위해 나온 도구로, 일종의 인터랙티브 트리 탐색기다. 명령 하나로 현재 디렉터리의 트리 구조를 화면에 펼쳐 보여주고, 사용자는 키보드로 해당 항목을 검색하거나 선택하여 즉시 이동, 열기, 삭제 등의 작업을 할 수 있다. broottree처럼 정적인 출력이 아니라 양방향 탐색 UI를 제공하므로, 마치 텍스트 기반 파일 관리자를 사용하는 느낌을 준다. 예를 들어 broot를 실행하면 터미널 전체에 트리구조가 나타나고, 부분 문자열을 타이핑하면 실시간 필터링되어 일치하는 디렉터리로 바로 점프할 수 있다. 또한 파일 미리보기, 숨김 파일 토글 등의 편의기능도 있다. 따라서 구조를 보기만 할 때는 tree, 탐색하고 조작하려면 broot라고 볼 수 있다. 다만 broot은 별도 설치가 필요하며 학습 난이도가 약간 있고, 단순 출력 결과를 다른 문서에 활용하는 용도로는 적합하지 않다. 한마디로 정적 vs 동적 용도로 tree와 broot이 구분된다.
    • 기타 도구: 이 밖에도 tree와 유사하거나 이를 확장한 도구들이 여럿 있다. 예를 들어 lsd는 exa와 비슷한 LS 대체로 아이콘과 트리 출력을 지원하며, ttreetre 등의 이름으로 tree 명령을 개선한 오픈소스 프로젝트들도 있다. 어떤 것들은 tree의 출력에 색상을 입히거나(alder 등), 인터랙티브 기능을 추가하고자(ictree 등) 만들어졌다. 그러나 이러한 툴들은 각자 장단이 있고 사용자가 목적에 따라 선택하면 된다. 속도 면에서는 전통적인 C 언어로 구현된 tree 명령이 매우 빠른 편이며, 기능 면에서는 현대적 대체품들이 좀 더 화려한 출력이나 특수 기능을 갖추고 있다. 예를 들어 exa는 git 상태 표시 기능이 있고, ncdu는 용량 정렬 기능이 있는 식이다. 하지만 학습자나 일반 사용자 입장에서는 tree만으로도 충분한 경우가 대부분이며, 대안 도구들은 특수한 필요(예: 터미널에서 직접 파일 조작까지 하고 싶다 등)에 따라 채택하면 된다.

     

    비교를 표로 정리하면 다음과 같다.

    도구 특징 및 차별점 (tree 대비)
    tree 깊이 들여쓴 구조 시각화 전용, 정적 출력. 필터/정렬 등 옵션 풍부, 요약 정보 제공.
    ls -R 기본 명령으로 재귀 출력 가능하나 트리 형식이 아님, 구조 파악 어려움. (tree보다 가독성 낮음)
    find 강력한 검색 및 조건 필터 기능, 경로 전체 출력. 스크립팅에 유리. (트리 구조 표현은 못함)
    exa --tree 현대적 ls 대체품. 컬러풀한 트리 출력, 아이콘/깃 상태 표시 지원. (tree 없이도 가능하나 exa 설치 필요)
    broot 터미널 탐색 UI 제공. 트리 보며 즉각 이동/파일열기/삭제 등 가능. (정적 출력 없음, 인터랙티브 전용)
    ncdu 디스크 사용량 분석 전용 트리. 용량 기준 정렬, 대화형 탐색 및 삭제 가능. (일반 파일구조 출력 목적 아님)

     

    이처럼 각 도구는 용도와 기능이 약간씩 다르므로 상호 보완적이다. 평소에는 ls로 간단히 보고, 구조가 궁금하면 tree를, 특정 조건 파일만 필요하면 find를, 컬러 예쁜 트리가 좋으면 exa를, 디스크 정리는 ncdu를 사용하는 식으로 병행할 수 있다. 결국 리눅스 환경에서는 tree 명령이 독자적인 위치를 차지하고 있으며, 그 이유는 다른 도구들이 제공하지 않는 간편한 "구조 시각화"라는 특화된 역할을 훌륭하게 수행하기 때문이다.

     

    설치 방법 및 환경별 주의점

    대부분의 리눅스 배포판은 공식 패키지 저장소를 통해 tree 명령을 제공한다. 시스템에 따라 기본으로 설치되어 있지 않으므로, 아래 방법으로 수동 설치할 수 있다.

    • Debian/Ubuntu 계열: APT 패키지 매니저로 설치한다. 예: sudo apt-get install tree. 우분투 등의 기본 저장소에 포함되어 있어 명령 한 줄로 설치 가능하다.
    • Red Hat 계열 (CentOS, Fedora 등): 과거에는 yum으로 설치했으며 최신 배포판에서는 dnf를 사용한다. 예: CentOS 7 이하는 sudo yum install tree, Fedora나 RHEL 8+에서는 sudo dnf install tree.
    • openSUSE: Zypper 패키지 매니저로 sudo zypper install tree 명령을 실행한다.
    • Arch Linux 계열: Pacman으로 공식 레포지토리에서 제공된다. 예: sudo pacman -S tree.
    • macOS: 맥OS에는 기본 탑재되어 있지 않으므로 Homebrew를 통해 설치할 수 있다. 예: brew install tree. 설치 후 터미널에서 tree 명령을 똑같이 활용 가능하다.
    • 기타 유닉스: FreeBSD 등에서는 패키지나 ports에서 tree를 찾아 설치하면 된다. 예를 들어 FreeBSD의 pkg에서는 pkg install tree로 설치 가능하며, OpenBSD 등에서는 소스 코드를 컴파일해 쓸 수도 있다. 소스코드는 GPL 라이선스로 공개되어 있어 SourceForge 등에서 다운로드할 수 있다.

     

    환경별로 특이사항으로는, 일부 (특히 오래된) 리눅스 콘솔 환경에서는 tree의 유니코드 선 그림이 깨져보일 수 있다. 이 경우 -S 옵션으로 CP437 ASCII 문자를 사용하도록 하거나, --charset 옵션으로 터미널 문자셋에 맞게 조정하면 문제를 해결할 수 있다. 예컨대 UTF-8 미지원 터미널에서는 tree -A로 실행하면 일반 ASCII 기호로 대체되어 출력된다. 또 한 가지, tree 사용 시 너무 거대한 경로(예: 루트 전체)를 대상로 하면 출력이 방대해져 성능이 느려지거나 파일기술자 한도를 초과할 수 있다. 이를 피하려면 -L로 탐색 깊이를 제한하거나 --filelimit N 옵션으로 특정 개수 이상의 파일이 있는 디렉터리는 아예 내려가지 않도록 설정할 수 있다. --filelimit에 숫자를 지정하면 그보다 항목이 많은 디렉터리는 "[---directories skipped]" 형태로 생략된다.

     

    또한 설치 후 tree 명령의 버전을 확인하려면 tree --version을 실행하면 된다. 2025년 현재 배포판에 따라 보통 1.8.0 이상 또는 2.x 대의 버전이 설치된다 (예: 트리 버전 2.0.1에서는 1996–2022년 개발자 명단이 표시된다). 만약 최신 기능(예: JSON 출력 등)이 필요하지만 패키지 버전이 낮다면, 소스를 받아 빌드하거나 별도로 최신 바이너리를 구해 설치할 수 있다. 다행히 tree는 의존성이 거의 없고 소스가 단일 C 파일로 구성되어 있어 빌드가 간단한 편이다.

     

    마지막으로, Windows 환경에서 리눅스용 tree와 유사한 기능을 원할 경우 WSL(Windows Subsystem for Linux)을 통해 해당 리눅스 배포판에서 tree를 설치하거나, Git Bash 등에 tree.exe를 복사해 넣는 방법도 있다. Windows 자체의 tree 명령(명령 프롬프트용)은 출력 형식이 약간 다르고 유니코드 문자를 사용하지 않는 등 차이가 있지만, 기본 개념은 동일하다. 크로스 플랫폼으로 문서화할 때는 이 차이를 염두에 두고 스크린샷이나 사용 예를 구분하는 것이 좋다.

     

    마치며

    tree 명령은 디렉터리 구조를 한눈에 보여주는 직관적인 도구로, 리눅스 입문자부터 숙련자까지 두루 활용하는 유틸리티다. 내부적으로는 재귀적인 탐색과 정렬을 거쳐 터미널에 계층 구조를 그려내는 간단한 동작이지만, 그 출력 결과는 복잡한 파일 체계를 이해하기 쉽게 시각화해준다. CLI 인터페이스 측면에서 tree는 풍부한 옵션을 제공하여 사용자의 필요에 맞게 출력을 커스터마이즈할 수 있고, JSON/XML/HTML과 같은 형식으로도 결과를 뽑아내어 다른 도구와 연계도 가능하다.

     

    교육 현장에서는 tree가 리눅스 파일시스템 개념을 가르치는 데 유용한 시각 교재가 되고, 개발자들은 프로젝트의 폴더 구조를 문서화하거나 배포물 검증에 tree 출력을 활용한다. 수많은 블로그와 매뉴얼에서 tree 예제가 등장하는 것은 이 도구의 가치를 방증하며, 커뮤니티에서도 디렉터리 구조를 이해하지 못해 질문이 올라오면 우선 tree 출력을 확인해보라는 답변을 쉽게 찾아볼 수 있다.

     

    물론 다른 대안들도 존재하지만, 간결한 트리 형식 출력이라는 tree만의 역할은 여전히 굳건하다. ls로는 얻을 수 없는 계층적 "조감도"tree는 제공하고, 이는 작은 개인 프로젝트부터 거대한 시스템 설정까지 작업 범위를 불문하고 유용하다. 만약 리눅스 환경에 익숙하지 않은 초보자라면, tree를 설치해서 자신의 홈 디렉터리나 시스템 폴더 구조를 한 번 쭉 살펴보길 권한다. 텍스트로 펼쳐지는 트리 구조를 보다 보면 디렉터리 간의 관계와 전체적인 시스템 구성이 한층 명확히 다가올 것이며, 이것이 tree 명령이 가지는 가장 큰 매력이라 할 수 있다.


    참고 문헌

    [^1]: tree 매뉴얼 페이지와 소스 코드 주석
    [^2]: Linux Foundation 튜토리얼, "Linux directory structure overview"
    [^3]: Lorna Jane의 블로그, "Using the tree command in tutorials"
    [^4]: Reddit r/linux, "Tree command tips for visualization"
    [^5]: StackExchange 교육자 커뮤니티, "Teaching filesystem concepts with tree"

    728x90
    728x90
    댓글