3P by GN⁺ | ★ favorite | 댓글 1개
  • eza는 Unix/Linux의 파일 목록 명령어 ls를 대체하는 현대적 CLI 도구로, 더 많은 기능과 더 나은 기본값을 제공하는 것을 목표로 함
  • 파일 유형과 메타데이터를 색상으로 구분하고, 심볼릭 링크·확장 속성·Git 정보를 인식하며, 작고 빠른 단일 바이너리로 제공됨
  • 기존 exa 대비 Grid Bug 수정, 하이퍼링크, 마운트 포인트 세부 정보, SELinux 컨텍스트, Git 저장소 상태, 사람이 읽기 쉬운 상대 날짜, 보안 수정, bright 터미널 색상, theme.yml 설정을 추가함
  • Windows, macOS, Linux에서 설치할 수 있고, Nix flake 환경에서는 nix run github:eza-community/eza로 빌드 후 실행 가능함
  • ls와 완전히 같지는 않은 옵션 체계를 갖고 있으며, 표시·필터링·긴 목록·테마 설정을 통해 파일 목록 출력 방식을 세밀하게 조정할 수 있음

eza가 제공하는 ls 대체 경험

  • eza는 Unix와 Linux 운영체제에 포함된 오래된 파일 목록 명령어 ls의 현대적 대안임
  • 기본 목표는 ls보다 기능이 많고 사용자 친화적인 버전을 제공하는 것임
  • 파일 유형과 메타데이터를 색상으로 구분함
  • 심볼릭 링크, 확장 속성, Git 정보를 인식함
  • 작고 빠르며 단일 바이너리로 제공됨

exa 대비 추가된 기능

  • eza에는 exa에 없던 기능이 다수 포함됨
    • exa 2021에서 도입된 “The Grid Bug” 수정
    • 하이퍼링크 지원
    • 마운트 포인트 세부 정보 출력
    • SELinux 컨텍스트 출력
    • Git 저장소 상태 출력
    • 사람이 읽기 쉬운 상대 날짜
    • 여러 보안 수정
    • bright 터미널 색상 지원
    • 더 작은 버그 수정과 변경 사항
    • 색상과 아이콘을 커스터마이즈하는 theme.yml 설정 파일

실행과 설치

  • Nix flake 지원 환경에서는 다음 명령으로 eza를 시도할 수 있음
    • nix run github:eza-community/eza
  • Nix는 eza를 빌드한 뒤 실행함
  • 인자를 전달하려면 다음처럼 -- 뒤에 옵션을 붙임
    • nix run github:eza-community/eza -- -ol
  • eza는 Windows, macOS, Linux에서 사용할 수 있음
  • 플랫폼과 배포판별 설치 방법은 INSTALL.md에 있음

명령줄 옵션 구성

  • eza의 옵션은 ls와 거의 같지만 완전히 같지는 않음
  • 표시 옵션

    • -1, --oneline: 한 줄에 항목 하나씩 표시
    • -G, --grid: 항목을 그리드로 표시하며 기본값임
    • -l, --long: 확장 세부 정보와 속성 표시
    • -R, --recurse: 디렉터리 재귀 탐색
    • -T, --tree: 디렉터리를 트리 형태로 재귀 표시
    • -F, --classify=(when): 파일 이름 옆에 유형 표시자 출력
    • --colour=(when), --color=(when): 터미널 색상 사용 시점 지정
    • --icons=(when): 아이콘 표시 시점 지정
    • --hyperlink=(when): 항목을 하이퍼링크로 표시할 시점 지정
    • --absolute=(mode): 항목의 절대 경로 표시 방식 지정
  • 필터링 옵션

    • -a, --all: 숨김 파일과 dot 파일 표시
    • -d, --treat-dirs-as-files: 디렉터리를 일반 파일처럼 나열
    • -L, --level=(depth): 재귀 깊이 제한
    • -s, --sort=(field): 정렬 필드 지정
    • --group-directories-first: 디렉터리를 먼저 표시
    • --group-directories-last: 디렉터리를 나중에 표시
    • -D, --only-dirs: 디렉터리만 표시
    • -f, --only-files: 파일만 표시
    • --git-ignore: .gitignore에 있는 파일 무시
    • -I, --ignore-glob=(globs): 파이프로 구분한 glob 패턴의 파일 무시
    • --all을 두 번 전달하면 ... 디렉터리도 표시함

긴 목록과 Git 관련 정보

  • --long 또는 -l 사용 시 긴 목록 옵션을 사용할 수 있음
  • 파일 크기와 권한 관련 옵션을 제공함
    • -b, --binary: 바이너리 접두사로 파일 크기 표시
    • -B, --bytes: 접두사 없이 바이트 단위로 파일 크기 표시
    • -o, --octal-permissions: 권한을 8진수 형식으로 표시
    • --no-permissions, --no-filesize, --no-user, --no-time: 각 필드 출력 억제
  • 파일 시스템과 메타데이터 관련 옵션을 제공함
    • -H, --links: 하드 링크 수 표시
    • -i, --inode: inode 번호 표시
    • -M, --mounts: 마운트 세부 정보 표시, Linux와 macOS에서만 사용 가능
    • -Z, --context: 보안 컨텍스트 표시
    • -@, --extended: 확장 속성과 크기 표시
    • --total-size: 재귀 디렉터리 크기 표시
  • Git 관련 출력도 지원함
    • --git: 추적되거나 무시된 각 파일의 Git 상태 표시
    • --git-repos: 추적된 각 디렉터리의 Git 상태 표시
    • --git-repos-no-status: 디렉터리가 Git 저장소인지 여부만 표시하며 더 빠름
    • --no-git: --git, --git-repos, --git-repos-no-status를 항상 무시하고 Git 상태 출력을 억제함
  • 시간 형식은 default, iso, long-iso, full-iso, relative, 또는 +<FORMAT> 형태의 사용자 지정 형식을 지원함
    • 예: +%Y-%m-%d %H:%M2023-09-30 13:00 형식으로 출력함
    • 자세한 형식 문자열은 eza(1) 매뉴얼 페이지와 chrono documentation을 참조함
  • 매뉴얼 페이지는 저장소의 man 디렉터리에서 볼 수 있고, 버전 [0.18.13] - 2024-04-25부터 터미널에서 man eza로도 사용할 수 있음

테마 커스터마이즈

  • eza는 최근 theme.yml 파일 지원을 추가함
  • theme.yml에서는 LS_COLORSEXA_COLORS 환경 변수에서 사용할 수 있던 기존 테마 옵션을 지정할 수 있음
  • 파일 유형과 확장자별로 다른 아이콘을 지정하는 옵션도 제공함
  • 기존 환경 변수가 설정되어 있으면 하위 호환성을 위해 계속 동작하며 우선순위를 가짐
  • 미리 만든 테마는 공식 eza-themes 저장소에서 확인하거나 직접 기여할 수 있음
  • 예제 테마 파일은 docs/theme.yml에 있음
  • 테마 파일은 EZA_CONFIG_DIR 환경 변수로 지정한 디렉터리에 두거나, 기본적으로 $XDG_CONFIG_HOME/eza에서 찾음
  • 자세한 내용은 eza_colors-explanation.5.mddocs/theme.yml에 있음

기여

댓글과 토론

Hacker News 의견들
  • 디렉터리 목록에서 사람이 읽기 쉬운 날짜가 특히 거슬림
    어제 오전 11시쯤 폴더에 복사한 걸 찾고 있는데 전부 “1 day ago”로 나오면 도움이 안 됨. 날짜와 시간이 필요하고, HN 같은 포럼도 마찬가지로 정확한 날짜/시간을 보여준 뒤 필요하면 “7 hours ago”를 같이 붙이면 됨
    왜 정보를 일부러 빼는지 이해가 안 되고, 무한 스크롤 같은 흐름의 결과인지 궁금함

    • 동의함. GitHub도 커밋에서 “foo.cpp modified last year”처럼 보여주는데, 추가 날짜/시간 정보를 볼 방법이 없다면 전혀 말이 안 됨
    • 사이트들이 이 용도로 HTML 태그를 쓸 수 있지 않을까 싶음. 사람이 읽기 쉬운 형식을 고르더라도 실제 시간을 남겨두면 확장 기능이 치환하거나 덧씌울 수 있음
      HTML 작성할 때는 항상 쓰려고 함
      (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
    • 정말 놀라운 안티 기능임. 변경 시점도 애매함. “1 day ago”가 언제 “2 days ago”가 되나? Google 기준으로는 48시간 뒤라서, 47시간 뒤에 보면 “1 day ago”라고 떠서 어제 일어난 것처럼 착각하게 됨
      특정 날짜를 친구 생일 다음 날이라 기억하고 어떤 항목을 찾으려 해도, 표시가 “three months ago”뿐이면 한 달치 자료를 뒤져야 함
    • 이건 설정이라서 원하는 날짜 형식으로 바꿀 수 있음
    • 이 방식이 싫음. Web 2.0 스타트업들에서 시작됐거나, 그 무렵 Google 같은 회사들의 웹앱/소셜 웹앱에서 퍼진 것 같음
      자세한 시간을 먼저 제공하고, 원한다면 “며칠 전” 표시도 같이 제공하면 됨
  • lsd도 있지만 여전히 eza를 더 선호함
    관심 있는 사람들을 위해 요즘 예전 도구 대신 쓰는 현대적인 명령줄 도구들이 있음: bat는 구문 강조가 있는 cat, difftastic은 더 나은 diff, gdu는 SSD용 ncdu, zoxide는 현대적인 cd, fdfind 대안, rgripgrep, fzf는 퍼지 검색기, jless는 마우스 접기가 되는 JSON 뷰어, dra는 릴리스 자산 다운로드/설치, lazygit은 Git TUI, lazydocker는 Docker TUI, yazi는 이미지 미리보기가 되는 파일 관리자, zellij는 더 나은 tmux/screen, starship은 여러 셸에서 쓰는 프롬프트 설정 도구임

    • 자주 쓰는 도구 4개를 더 추가하면, task는 Makefile 대안, hyperfine벤치마크 도구, vegeta는 부하 테스트 도구, sd는 더 낫고 직관적인 sed
      JSON 삼총사도 있음: jq는 잘 알려진 JSON 처리기, jc는 여러 CLI 도구 출력을 JSON으로 변환, gron은 JSON을 grep하기 쉽게 만들어줌
    • fdrg는 기본적으로 .gitignore에 포함된 항목을 무시한다는 점을 조심해야 함. 단순한 find 대체품이라고 생각하면 놀랄 수 있음. 관련 논의는 [0]에 있음
      이런 도구를 추천할 때는 이 점을 분명히 알려야 함. 문서를 안 읽으면 놓치기 쉬움. 개인적으로 이런 대체 coreutils류 도구들이 기본값을 원본 도구와 더 비슷하게 유지했으면 함. “find의 단순하고 빠르고 사용자 친화적인 대안”이라고 홍보한다면 새 사용자의 놀람을 줄이기 위해 원본 기본값을 존중해야 함. 별칭은 존재하니까 ~/.${SHELL##*/}rcalias fd='fd --ignore'를 두는 편이 alias fd='fd --no-ignore'보다 낫다고 봄
      팁으로, 별칭이 적용되지 않은 버전을 쓰고 싶으면 \command를 쓰면 됨. 예를 들어 alias grep='grep --color=always --no-messages --binary-files=without-match를 쓰는데, 색상 옵션이 문자 표현을 바꿔서 curl로 파이프하면 오류가 날 수 있음. 모든 파이프에서 그런 건 아니지만 처음 만나면 꽤 당황스러움. echo "Hello world" | \grep --color=always "Hello" | hexdump!!:s^always^never로 확인 가능함
      [0] https://github.com/sharkdp/fd/issues/612
    • 이 링크에도 들어본 적 없지만 흥미로워 보이는 추가 도구 목록이 큼
      https://github.com/ibraheemdev/modern-unix
    • 이런 도구 대부분이 Rust로 작성됐다는 점이 좋음
    • zellijscreen보다 낫다고 느끼지는 못했음. 탭/화면 번호가 제대로 매겨지지 않아 바로 전환하려면 직접 세어야 해서, 이건 받아들이기 어려움
  • GNU ls는 유지보수되고 있음. ls.c 파일에 영향을 주는 커밋이 2024-06-24와 2024-06-27에도 있었고, 한 달도 안 됐음
    GNU Coreutils 메일링 리스트도 꽤 활발함. 이 프로젝트는 “maintained”를 “활발히 개발됨”이라는 뜻으로 쓰는 것 같음

    • 여기서 말하는 건 eza가 포크한 exa를 가리키는 듯함. exa는 저장소 쓰기 권한이 있던 유일한 사람이 공식적으로 deprecated 표시하기 전까지 약 1년간 유지보수되지 않았음
      이제 포크된 지도 꽤 지나서 모두가 exa를 아는 게 아니고, 이 표현의 의도도 훨씬 불명확해졌음. 비슷한 반응이 있으니 문구를 업데이트할 때가 된 것 같음
    • 여기서 “maintained”는 ls가 유지보수되지 않는다는 뜻이 아니라, 더 이상 유지보수되지 않는 ls 대체품 exa의 포크로서 유지보수되는 대체품이라는 뜻임
  • fish 셸로 바꾼 뒤 ls 사용량이 100% 줄었음. 내장 Alt + l 명령이 디렉터리 내용을 보여줘서 매우 유용하고, 셸 기록도 더 깔끔해짐

    • Bash에서도 ls 같은 명령을 HISTIGNORE 환경 변수에 추가하면 히스토리를 더 깔끔하게 유지할 수 있음: https://superuser.com/questions/232885/can-you-share-wisdom-...
    • 좋은 팁임. fish에서 ls 사용 대부분을 없앤 건 디렉터리를 바꿀 때 자동으로 ls를 실행하게 한 설정이었음
      function ls_on_cd --on-variable PWD
      ls
      end
    • Bash 사용자도 이런 식으로 단축키를 바인딩할 수 있음. 오른손 홈 로우 키들을 __bash_ctrl_n() 같은 함수에 묶어두고, dotfiles의 여러 도구가 이 함수들을 덮어쓰게 해둠. 예를 들어 Git이 설치되어 있으면 __bash_ctrl_e()git statusgit log를 실행하게 설정함
    • 내 환경에서는 아마 lseza로 별칭 지정해둔 탓에 이 기능이 eza를 실행하는 것 같음. 결국 그냥 ls를 실행하는 듯함
    • ls 실행 대부분이 cd 직후라는 걸 깨닫고 시작 파일에 추가했음. 이제 거의 모든 cd가 자동으로 ls를 실행함
      Bash에서는 cd() 함수에서 builtin cd "$@" && ls -l을 호출하고, fish에서는 builtin cd $argv 후 오류가 없고 홈 이동이 아닐 때 dir을 실행하게 해둠
  • 파일 종류나 속성을 구분하려고 색상을 강요하는 터미널 도구들이 전반적으로 불편함. 배포판의 ls도 그런 식으로 설정된 경우가 많지만, 그런 설정은 지우고 기본값을 씀
    눈이 편한 터미널 배경을 쓰는데, 이런 색상 스킴은 항상 배경과 충돌하거나 보기 어려운 색을 포함. ls나 그 대체품 출력에는 색상이 필요 없고, ls -AFC가 주는 정도면 충분함

    • 도구들이 임의의 “256 color”나 “RGB” 색상 모드 대신 Base16 Framework[0]를 쓰면 훨씬 덜 문제가 될 것임. 출력은 터미널에서 정의한, 읽을 수 있을 것으로 예상되는 색상으로 표시될 테니까
      [0] https://github.com/chriskempson/base16
      [1] https://tinted-theming.github.io/base16-gallery/
    • 나는 완전히 반대로 색상화된 출력에 크게 의존함
      그래도 해결책은 있어야 하고, $NO_COLOR에 어떤 값을 설정하면 됨. https://no-color.org
      이 환경 변수를 확인하고 존중하지 않는 도구에는 버그 리포트를 넣는 게 충분히 타당함
    • https://no-color.org
    • vivid[1]를 써서 터미널 배경에 맞는 테마를 고르고, 생성된 LS_COLORS 변수를 셸에 로드하면 됨
      [1]: https://github.com/sharkdp/vivid/
  • README에 ezaexa의 포크라고 적혀 있지 않은 게 이상함

    • “eza features not in exa”라고는 하니 존재 자체는 언급함. 다만 링크나 맥락은 없음
  • GNU 유틸리티의 새 버전들이 왜 이렇게 MIT 라이선스로 많이 만들어지는지 궁금함. 꽤 많아 보임

    • Rust 사용자들은 전반적으로 코드를 허용적 라이선스로 공개하는 경향이 있음. 쉽게 확인할 수 있는 통계가 있는지는 모르겠지만 Rust 패키지 저장소인 crates.io의 거의 모든 것이 MIT나 Apache-2.0이고, 인기 라이브러리들은 확실히 그렇다 봄
    • GNU 프로젝트가 ls를 발명한 건 아님. ls를 포함한 GNU coreutils도 원래는 독점 AT&T 유틸리티나 BSD 라이선스 유틸리티의 새 버전이었음
    • 관련해서 https://github.com/uutils/coreutils는 “GNU coreutils의 크로스 플랫폼 Rust 재작성”임
  • ls 대체품에 왜 KerberosSSH가 필요함?
    ldd /usr/bin/eza를 보면 libgit2, libgssapi_krb5, libmbedtls, libssh2, libkrb5, libcrypto, libzstd 등 꽤 많은 라이브러리에 연결되어 있음

    • 하필 ls에 필요한 것치고는 의존성이 너무 많음
  • QWERTY 키보드에서 eza는 세 글자 조합이 꽤 끔찍함. ls의 장점 중 하나는 매우 빠르게 칠 수 있는 키 조합이라는 점임
    별칭을 만들 수는 있겠지만, 호환성 같은 이유로 좀 이상하게 느껴짐

    • 2015년쯤부터 eza, 그 전에는 exals, ll, lll로 별칭 지정해왔는데 호환성 문제를 겪은 적은 없음
      sl도 설치해둬서 잘못 입력하지 않도록 스스로를 훈련함
    • Dvorak 사용자 입장에서는 eza가 개선처럼 보임. Dvorak에서 ls는 QWERTY 기준 p-라서 둘 다 오른손 새끼손가락 키임
    • 별칭 지정이 왜 이상한지 더 설명해줄 수 있음?
    • 원하는 아무 이름으로든 별칭을 만들 수 있음
    • 이런 때는 AZERTY 키보드가 빛남
  • 어차피 누가 ls를 쓰나? 필요한 파일이 나올 때까지 탭 자동완성만 함
    농담은 그렇다 치고, 왜 ls가 더 이상 유지보수되지 않는다고 주장하는지 궁금함

    • ls가 아니라 더 이상 유지보수되지 않는 exa[0]를 가리키는 것 같음
      [0]https://github.com/ogham/exa
    • 어떤 이유에서인지, 소프트웨어가 정기적으로 업데이트되지 않으면 본질적으로 구식이라고 생각하는 게 표준처럼 되어버렸음
    • 당연히 ls는 셸 또는 coreutils의 일부로 유지보수되고 있음
      다만 ezaexa의 변형이고, 내가 알기로 exa는 더 이상 유지보수되지 않음
    • 기존 도구가 유지보수되지 않는 것처럼 보이게 하려고 “maintained”와 “actively developed”를 의도적으로 혼동하는 것임