Eza: 현대적이고 유지 관리되는 ls 대체 프로그램
(github.com/eza-community)- 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에 없던 기능이 다수 포함됨exa2021에서 도입된 “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:%M은2023-09-30 13:00형식으로 출력함 - 자세한 형식 문자열은
eza(1)매뉴얼 페이지와 chrono documentation을 참조함
- 예:
- 매뉴얼 페이지는 저장소의 man 디렉터리에서 볼 수 있고, 버전
[0.18.13] - 2024-04-25부터 터미널에서man eza로도 사용할 수 있음
테마 커스터마이즈
- eza는 최근
theme.yml파일 지원을 추가함 theme.yml에서는LS_COLORS와EXA_COLORS환경 변수에서 사용할 수 있던 기존 테마 옵션을 지정할 수 있음- 파일 유형과 확장자별로 다른 아이콘을 지정하는 옵션도 제공함
- 기존 환경 변수가 설정되어 있으면 하위 호환성을 위해 계속 동작하며 우선순위를 가짐
- 미리 만든 테마는 공식 eza-themes 저장소에서 확인하거나 직접 기여할 수 있음
- 예제 테마 파일은
docs/theme.yml에 있음 - 테마 파일은
EZA_CONFIG_DIR환경 변수로 지정한 디렉터리에 두거나, 기본적으로$XDG_CONFIG_HOME/eza에서 찾음 - 자세한 내용은 eza_colors-explanation.5.md와 docs/theme.yml에 있음
기여
- eza에 기여하려면 code of conduct를 따라야 함
- 실제 개발 참여 정보는 CONTRIBUTING.md에 있음
댓글과 토론
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,fd는find대안,rg는ripgrep,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하기 쉽게 만들어줌 fd와rg는 기본적으로.gitignore에 포함된 항목을 무시한다는 점을 조심해야 함. 단순한find대체품이라고 생각하면 놀랄 수 있음. 관련 논의는 [0]에 있음
이런 도구를 추천할 때는 이 점을 분명히 알려야 함. 문서를 안 읽으면 놓치기 쉬움. 개인적으로 이런 대체 coreutils류 도구들이 기본값을 원본 도구와 더 비슷하게 유지했으면 함. “find의 단순하고 빠르고 사용자 친화적인 대안”이라고 홍보한다면 새 사용자의 놀람을 줄이기 위해 원본 기본값을 존중해야 함. 별칭은 존재하니까~/.${SHELL##*/}rc에alias 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로 작성됐다는 점이 좋음
zellij가screen보다 낫다고 느끼지는 못했음. 탭/화면 번호가 제대로 매겨지지 않아 바로 전환하려면 직접 세어야 해서, 이건 받아들이기 어려움
- 자주 쓰는 도구 4개를 더 추가하면,
-
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 status와git log를 실행하게 설정함 - 내 환경에서는 아마
ls를eza로 별칭 지정해둔 탓에 이 기능이eza를 실행하는 것 같음. 결국 그냥ls를 실행하는 듯함 ls실행 대부분이cd직후라는 걸 깨닫고 시작 파일에 추가했음. 이제 거의 모든cd가 자동으로ls를 실행함
Bash에서는cd()함수에서builtin cd "$@" && ls -l을 호출하고, fish에서는builtin cd $argv후 오류가 없고 홈 이동이 아닐 때dir을 실행하게 해둠
- Bash에서도
-
파일 종류나 속성을 구분하려고 색상을 강요하는 터미널 도구들이 전반적으로 불편함. 배포판의
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/
- 도구들이 임의의 “256 color”나 “RGB” 색상 모드 대신 Base16 Framework[0]를 쓰면 훨씬 덜 문제가 될 것임. 출력은 터미널에서 정의한, 읽을 수 있을 것으로 예상되는 색상으로 표시될 테니까
-
README에
eza가exa의 포크라고 적혀 있지 않은 게 이상함- “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대체품에 왜 Kerberos와 SSH가 필요함?
ldd /usr/bin/eza를 보면libgit2,libgssapi_krb5,libmbedtls,libssh2,libkrb5,libcrypto,libzstd등 꽤 많은 라이브러리에 연결되어 있음- 하필
ls에 필요한 것치고는 의존성이 너무 많음
- 하필
-
QWERTY 키보드에서
eza는 세 글자 조합이 꽤 끔찍함.ls의 장점 중 하나는 매우 빠르게 칠 수 있는 키 조합이라는 점임
별칭을 만들 수는 있겠지만, 호환성 같은 이유로 좀 이상하게 느껴짐- 2015년쯤부터
eza, 그 전에는exa를ls,ll,lll로 별칭 지정해왔는데 호환성 문제를 겪은 적은 없음
sl도 설치해둬서 잘못 입력하지 않도록 스스로를 훈련함 - Dvorak 사용자 입장에서는
eza가 개선처럼 보임. Dvorak에서ls는 QWERTY 기준p-라서 둘 다 오른손 새끼손가락 키임 - 별칭 지정이 왜 이상한지 더 설명해줄 수 있음?
- 원하는 아무 이름으로든 별칭을 만들 수 있음
- 이런 때는 AZERTY 키보드가 빛남
- 2015년쯤부터
-
어차피 누가
ls를 쓰나? 필요한 파일이 나올 때까지 탭 자동완성만 함
농담은 그렇다 치고, 왜ls가 더 이상 유지보수되지 않는다고 주장하는지 궁금함ls가 아니라 더 이상 유지보수되지 않는 exa[0]를 가리키는 것 같음
[0]https://github.com/ogham/exa- 어떤 이유에서인지, 소프트웨어가 정기적으로 업데이트되지 않으면 본질적으로 구식이라고 생각하는 게 표준처럼 되어버렸음
- 당연히
ls는 셸 또는 coreutils의 일부로 유지보수되고 있음
다만eza는exa의 변형이고, 내가 알기로exa는 더 이상 유지보수되지 않음 - 기존 도구가 유지보수되지 않는 것처럼 보이게 하려고 “maintained”와 “actively developed”를 의도적으로 혼동하는 것임