fd - `find`의 간단하고 빠르며 사용자 친화적인 대체제
(github.com/sharkdp)-
fd
는 파일 시스템에서 항목을 찾기 위한 프로그램으로, 기존find
명령어보다 간단하고 빠르며 사용자 친화적인 대안임-
find
의 모든 기능을 지원하지는 않지만, 일반적인 사용 사례에 대해 합리적인 기본값 제공
-
- 윈도우,맥,리눅스
-
직관적인 문법:
fd PATTERN
형식으로 간단하게 사용 가능 (find -iname '*PATTERN*'
보다 간편함) - 정규 표현식 및 glob 패턴 지원
- 병렬 디렉토리 탐색으로 빠른 성능 제공
-
파일 유형에 따른 색상 강조 (
ls
와 유사) - 병렬 명령 실행 지원
- 스마트 대소문자 구분: 기본적으로 대소문자 무시, 대문자 포함 시 대소문자 구분
- 숨김 파일 및 디렉토리 기본적으로 무시
-
.gitignore
패턴 기본적으로 무시 -
명령어 이름이
find
보다 50% 짧음
사용법
- 현재 디렉토리에서 패턴이 포함된 항목 검색
fd netfl
- 정규 표현식을 사용한 검색 가능
fd '^x.*rc$'
- 특정 디렉토리에서 검색
fd passwd /etc
- 현재 디렉토리 아래의 모든 파일 목록 재귀적으로 리스팅
fd
- 특정 파일 형식 검색 가능 (-e 옵션 사용)
fd -e md
- 정확한 파일명 검색 가능 (-g 옵션 사용)
fd -g libc.so /usr
- 숨김 파일 및 무시된 파일 포함 검색 (-H, -I 옵션 사용)
fd -H pre-commit
fd -I num_cpu
- 파일 이름이 아닌 전체 경로에서 검색 (-p 옵션 사용)
fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)'
- 검색된 각 결과에 대해 명령 실행 (-x)
fd -e zip -x unzip
- 모든 검색 결과를 하나의 명령에 전달 (-X)
fd -g 'test_*.py' -X vim
- 자리 표시자(Placeholder) 구문
- {}: 검색 결과 전체 경로
- {.}: 파일 확장자 제외 경로
- {/}: 파일명
- {//}: 부모 디렉토리
- {/.}: 파일명에서 확장자 제외
- 특정 디렉토리 또는 파일 제외 가능 (-E 옵션 사용)
fd -H -E .git
- .fdignore 파일을 만들어 전역 제외 패턴 설정 가능
- 검색된 파일 삭제 가능 (-X rm)
fd -H '^\.DS_Store$' -tf -X rm
주요 명령어 옵션
- -H: 숨김 파일 및 디렉토리 포함 검색
- -I: .gitignore 및 .fdignore 무시
- -p: 전체 경로에서 검색
- -e: 특정 확장자 검색
- -x: 검색 결과에 명령 실행
- -X: 모든 검색 결과를 하나의 명령에 전달
- -E: 특정 파일 또는 디렉토리 제외
성능 비교 (Benchmark)
- 750,000개 디렉토리와 400만 개 파일에서 검색 테스트 결과
- find 성능: 약 19.9초
- fd 성능: 약 854.8ms
- find보다 23배 빠름
다른 프로그램과의 통합
- fd 검색 결과를 fzf에서 표시 가능
export FZF_DEFAULT_COMMAND='fd --type file'
- fd 출력 결과를 rofi에서 메뉴로 표시
fd --type f -e pdf . $HOME | rofi -dmenu
- 출력 결과를 트리 구조로 표시
fd | tree --fromfile
- 검색 결과를 xargs에서 사용 가능
fd -0 -e rs | xargs -0 wc -l
Hacker News 의견
- Alfred workflow를 출시했음. 사용자 정의 디렉토리를 검색하는 데 fd를 많이 사용함. 매일 사용하며 매우 훌륭함
- Hyperfine도 과소평가된 훌륭한 도구임
- sharkdp의 팬임. 매일 사용하는 멋진 소프트웨어를 만들어줘서 고마움
- bat, fd, hexyl, hyperfine을 사용함
- 잘 보상받는 엔지니어들이 매달 $10씩 기부하면 인터넷이 더 나아질 것임
- 많은 훌륭한 도구들이 있으며, 이를 지원하는 생태계를 만들어야 함
- fd, bat, numbat, hexyl, hyperfine을 빠르게 설치하고 스크린샷을 Terminal Trove에서 볼 수 있음
- fd, bat, numbat, hyperfine, hexyl의 링크 제공
- 설치와 스크린샷 확인 가능
- fd와 rg의 플래그가 일치했으면 좋겠음. 예를 들어, fd와 rg 모두 --type 플래그가 있지만 의미가 다름
- fd는 파일/디렉토리/심볼릭 링크 등을 의미하고, rg는 파일 MIME 타입을 의미함
- fd에는 --extension 플래그가 있지만 rg에는 없음
- 두 도구의 사용이 높은 상관관계를 가지므로 유사한 이름의 플래그가 유익할 것임
- 새로운 Rust 도구를 사용하지 않는 이유는 원래 도구의 옵션을 기억하기 어려워서임
- ripgrep을 VS Code에서 사용하지만 명령줄에서는 grep을 사용함
- 도구가 작동하기만 하면 어떤 언어로 작성되었는지는 상관없음
- GNU Stow는 Perl로 작성되었지만 좋아하는 Unix 도구 중 하나임
- Rust 도구가 드롭인 대체품이라도 수동으로 설치하지 않을 것임
- 사용자로서 속도 개선과 메모리 안전성은 중요하지 않음
- Go 같은 다른 언어도 메모리 안전성을 보장하며, 커뮤니티 참여도 높음
- Rust가 구세주라는 서사에 완전히 설득되지 않음
- macOS나 Ubuntu가 Rust 대체품으로 교체해도 워크플로우에 지장이 없다면 불만 없음
- Terminal Trove를 가끔씩 확인해야 함
- 자주 사용하는 도구의 쉬운 대체품을 찾을 수 있음
- find는 fd로, time은 hyperfine으로, grep은 ripgrep으로 대체 가능
- asciinema를 .gif로 변환하는 t-rec, 수동으로 커밋 생성하는 koji 등
- fd를 사용해볼 예정임. find의 인수 사용법을 기억하기 어려워서 find . | grep what_i_am_looking_for를 주로 사용함
- xargs와 통합된 동작이 마음에 듦
- fd가 symlink 디렉토리 탐색을 어떻게 처리하는지 찾지 못했음
- 매일 fd를 많이 사용하며 새 기기에 기본 설치함
- find를 오랫동안 사용했지만 편리한 사용성은 아님
- 최근 대체 유틸리티 트렌드에 100% 동의함
- 원래의 유연성을 모두 유지하지 않을 수도 있지만 일반적인 경우에 사용하기 훨씬 쉬움
- 기본적으로 많은 폴더를 무시하는 것이 불편함
- 시스템 어디에 있는지 알고 싶을 때 find를 사용함
- fd에 무시하지 않는 옵션이 있지만 기억하지 못해 find로 돌아감
- 새로운 Rust CLI 도구를 좋아하지만 fd는 tar와 ln처럼 사용법을 기억하기 어려움
- 누구의 잘못도 아님
- 항상 매뉴얼을 다시 읽어야 함
- GNU find의 특이점에도 불구하고 더 잘 기억됨