directory 를 조회하는 ls 명령을 대체하는 exa 명령어 사용법
개요
exa 는 Unix/Linux 에서 파일이나 디렉터리를 조회하는 전통적인 프로그램인 ls 의 modern 한 대체제입니다.
다양한 파일 포맷과 메타 데이터를 color 로 표시해 주며 git 과 통합되어 있고 사용이 쉽고 속도가 빠릅니다.
ls 는 45년전에 개발되었고 그때와 지금의 컴퓨팅 환경은 다르며 exa 는 시대에 맞지 않는 가정을 다 버리고 현재 환경에 맞는 커맨드로 설계되었습니다.
느린 컴퓨터와 네트워크
Unix 가 사용되던 시대는 Computer 가 지금에 비해 어마어마하게 느렸고 network 도 느려서 정보를 전송할 때 정보량을 최소화하여 조금이라도 빠르게 전송하려고 모든 명령어는 축약해서 사용했습니다.
예로 exa 가 대체하려는 목록을 보는 커맨드인 ls나 파일을 이동하는 mv, 복사하는 cp 등은 다 이런 이유때문에 축약된 명령어입니다.
256 색 터미널의 일반화
ls 가 만들어질 당시에는 터미널의 기능이 제한적이어서 컬러 출력등은 기본 기능이 아니었고 ls 는 터미널에서 컬러 표시를 opt-in 방식으로 지원합니다.
이제는 물리적인 terminal 을 사용하지 않고 software 를 사용하며 true color 까지 지원하므로 exa 는 ls 와는 달리 opt-out 방식으로 지원합니다.
하지만 ls를 삭제할 필요는 없습니다. 시스템의 disk 가 망가져서 rescue mode 로 부팅하거나 ls를 호출하는 shell script 가 있기 때문에 비상용이나 호환용으로 ls 를 사용하면 됩니다.
설치
package manager 는 예전 버전이 설치될 수 있으므로 cargo 빌드해서 사용하는 것을 권장합니다.
Package manager 사용
Ubuntu
$ sudo apt install exa
OSX
$ brew install exa
Windows
$ sudo apt install exa
소스에서 설치
$ cargo install exa
shell completion 설치
exa 는 다양한 옵션이 많으므로 일일이 다 기억하기 어렵습니다. exa 저장소에서 쉘 자동 완성 기능을 제공하므로 이를 설치하면 더 편리하게 사용할 수 있습니다.
bash
sudo curl -o /etc/bash_completion.d/exa https://raw.githubusercontent.com/ogham/exa/master/completions/bash/exa
현재 세션에 바로 적용하려면 source 명령어로 반영합니다.
source /etc/bash_completion.d/exa
기능
exa 는 다양한 기능을 제공하고 있으므로 exa 홈페이지에 있는 주요 기능을 정리해 보았습니다.
colours
exa 는 파일 유형에 맞게 색을 지정할 수 있으며 opt-out 방식이므로 별도 설정없이 컬러로 표시합니다. 다양한 유형에 대한 설정을 내장하고 있으며 다음은 미리 정의된 파일 유형입니다.
exa는 ls 의 color 설정시 사용하는 변수인 LS_COLORS 를 내장하고 있으며 기존 LS_COLORS 변수가 있다면 기존 값을 사용합니다.
TYPE INDICATORS
exa 는 -F,
--classify
옵션을 주면 type indicator 라고 하는 특별한 표시를 출력에 추가합니다.
이 표시는 실행 파일인지, 디렉터리인지, socket 인지, link 인지 여부를 한 눈에 알아볼수 있게 해줍니다.
grid view
long view
-l 옵션을 추가하면 long view 로 동작하며 파일의 자세한 정보뿐만 아니라 메타 데이터(permission bit, file size, 생성/수정일 등)까지 표시합니다.
Unix permission bit
다음은 --list-dirs 로 4가지 파일의 유형(build.rs, contrib, /dev/stdout, /dev/tun0) 을 컬럼 헤더를 포함해서 출력합니다.
$ exa --header --long --list-dirs build.rs contrib /dev/{stdout,tun0}
file size
exa 는 파일 사이즈를 표시할 때 기본적으로 10진수에 접미사(M, G, T)를 붙여서 크기를 표시하지만 -b, --binary 옵션을 사용하면 kibibytes, mibibytes 처럼 바이너리 포맷으로 표시할 수 있습니다.
또 -B, --bytes 옵션을 사용하면 정확한 숫자를 표시합니다.
owner & groups
exa 를 사용하면서 제일 좋았던 기능중에 하나인데 파일이나 폴더를 표시할 때 현재 사용자가 user 와 group 필드에 관련이 있는지 계산해서 표시해 주므로 권한 관련해서 실수를 할 여지를 줄여줍니다.
exa -d --header --group --long /Users /Users/ben /Users/Guest
예로 admin 그룹과 staff 그룹에 속해 있는 ben 이라는 사용자가 위 명령을 실행하면 다음과 같이 표시됩니다.
이는 /Users/ben 은 ben 소유의 폴더이므로 highlighting 해서 표시하며 /Users/guest 는 owner, group 에 전혀 권한이 없으므로 회색으로 표시합니다.
/Users 는 root 사용자와 admin 그룹 소유인데 ben 은 admin 그룹에 포함되어 있으므로 그룹 필드만 강조해서 표시합니다.
tree view
exa 는 tree 옵션을 사용하면 tree 명령어 처럼 계층 구조를 표시할 수 있습니다.
다음은 2 단계 레벨의 tree 구조로 디렉터리와 파일을 표시해 줍니다.
$ exa --tree --level=2 rust/rust-ansi-parse
git integration
exa 는 git 통합 기능을 제공하므로 git status 를 같이 표시할 수 있습니다.
$ exa --long --git
Filtering
glob pattern 으로 file ignore
exa 는 ?, * glob 패턴을 지원하므로 표시하지 않을 파일이 있을 경우 --ignore-glob 로 무시할 패턴을 지정해 주면 됩니다.
다음은 case 가 들어가는 모든 파일들을 표시하지 않습니다.
exa --ignore-glob="*case*"
여러 개의 패턴이 있을 경우 다음과 같이 pipe(|) 로 여러 패턴을 연결해서 기술해 주면 됩니다.
exa --ignore-glob="Open*|rot??.sh|*case*"
hidden file 과 dot file
exa 는 기본적으로 hidden 속성을 갖고 있거나 Unix 에서 관례상 hidden 으로 처리하는 dot 으로 시작하는 파일들(Ex: .bash_profile, .vimrc) 은 표시하지 않습니다.
hidden 속성을 갖는 파일도 표시하려면 -a, --all 옵션을 사용하면 됩니다.
$ exa -a -l
특이한 점은 현재 폴더를 의미하는 . 과 상위 폴더를 의미하는 .. 도 같이 표시하려면 -a 를 2번 사용하면 됩니다.
$ exa -a -a -l
sorting
exa 는 출력시 정렬 기능을 제공하는 --sort=SORT_FIELD 옵션이 있는데 SORT_FIELD 에 정렬 대상을 지정하면 되며 다음과 같은 SORT_FIELD 를 지원합니다.
다음은 file name 으로 정렬하는 예시입니다.
exa --sort=name
SORT_FIELD 에 대문자가 있을 경우 대소문자 구분을 하지 않습니다. 다음은 대소문자 구분을 하지 않고 이름으로 정렬하는 예제입니다.
exa --sort=Name
역순으로 정렬할 경우 -r, --reverse 옵션을 지정하면 됩니다.
icon 표시
--icons 옵션을 사용하면 파일 유형에 따라 별도의 icon 을 표시할 수 있습니다.
$ exa --icons
만약 icon 이 표시되지 않는다면 현재 터미널 폰트에 아이콘이 없는 것이므로 Nerd Fonts 에서 현재 사용하는 폰트용 패치가 있는지 확인해 보고 있으면 해당 폰트로 교체해야 합니다.