Linux find 를 대체하는 fd 명령어 사용법


fd 는 file system 에서 특정 엔트리를 찾는 명령어로 find 보다 더 사용자 친화적이며 속도도 빠릅니다.


물론 find 보다 옵션이나 기능이 적긴 하지만 많이 사용하는 사례에 대해 합리적인 기능을 제공합니다.


fd 의 저자인 David Peter는 bathyperfine 및 다수의 오픈소스 프로젝트 저자이며 모두 Rust 로 작성되었습니다.


설치

패키지 매니저 사용

Ubuntu

sudo apt install fd-find


Windows

choco install fd

Alpine Linux

apk add fd


Source 에서 빌드

CentOS 처럼 지원되지 않는 배포판이거나 최신 버전을 사용할 경우 Rust 로 개발되었으므로 rush 개발도구와 cargo 를 설치한 후에 빌드해도 됩니다.

cargo install fd-find

사용

기본 사용

fd 는 기본적으로 찾을 패턴을 주면 smart case 방식으로 해당 패턴이 들어간 모든 파일이나 폴더를 출력합니다.

smart case 는 기본적으로 대소문자 구분을 하지 않지만 PATTERN 에 대문자가 있으면 대소문자를 구분합니다.

fd pattern

즉 위의 fd 명령은 다음 find 명령과 동일합니다.

find . -iname \*pattern\*


예로 options 라는 단어가 들어간 모든 파일을 찾으려면 다음과 같이 간단하게 사용하면 됩니다.

$ fd options

src/options.rs

대상 path 지정

fd 는 기본적으로 현재 폴더를 찾지만 find 처럼 다른 폴더를 지정해서 검색할 수 있습니다. 주의할 점은 검색 대상 PATH 를 지정할 때 앞에 . 을 하나 찍어 줘야 합니다.

다음은 /var/libs 폴더 아래에서 options 가 들어가는 모든 파일을 검색합니다.

$ fd options /var/libs  

/var/lib/letsencrypt/backups/1623826821.3591514/options-ssl-nginx.conf_4

ignore 파일도 찾기

fd 는 검색하지 않을 패턴들을 $HOME/.fdignore 파일에 등록해 두면 이 파일들은 검색시 자동으로 제외됩니다.

마찬가지로 .gitignore 에 등록된 패턴들은 찾지 않으므로 다음과 같이 ignore 에 등록되어 있다면 검색시 .class 와 .xml 이 아닌 파일만 출력합니다.

*.class
*.xml

-I, --no-ignore 옵션를 사용하면 .gitignore.fdignore 에 등록된 파일 패턴도 검색합니다.


정규식

찾을 패턴에 정규식을 사용할 수도 있습니다 .다음은 /etc 폴더에서 n 으로 시작하고 conf 로 끝나는 모든 파일 목록을 출력합니다.

$ fd /etc
$ fd '^n.*conf$' 

NetworkManager/NetworkManager.conf
X11/xinit/xinput.d/none.conf
authselect/nsswitch.conf
dbus-1/system.d/net.hadess.SensorProxy.conf

정규식은 Rust 의 문법을 따릅니다. (링크)


확장자(extension)로 찾기

-e 옵션으로 특정 확장자를 갖는 모든 파일을 검색할 수 있습니다. 다음은 /usr/lib64 폴더내의 .so 로 끝나는 모든 파일 목록을 출력합니다.

$ fd /usr/lib64
$ fd -e so

...
libutil-2.32.so
libmultipath.so
libBrokenLocale-2.32.so

glob 패턴 사용

-g, --glob 옵션을 사용하면 경로에서 패턴과 일치하는 파일을 알수 있습니다. 다음은 /usr/lib64 에서 libc*.so 파일을 출력합니다.

$ fd -g 'libc-*.so' /usr/lib64/


/usr/lib64/libc-2.32.so

size 로 찾기

-S, --size 를 사용하면 크기를 지정해서 검색할 수 있습니다.  > 는 (plus) 기호를 < 는 (minus) 기호를 사용해서 이상과 미만을 표시할 수 있습니다.

다음은 /usr/lib64 에서 크기가 1M 보다 크고 확장자가 .so 인 파일의 상세 정보를 출력합니다.

$ fd . -S +1m -e so  /usr/lib64/  -l

-rwxr-xr-x. 1 root root  14M Mar 27 01:11 /usr/lib64/dri/i965_dri.so
-rwxr-xr-x. 8 root root  22M Mar 27 01:11 /usr/lib64/dri/iris_dri.so
-rwxr-xr-x. 8 root root  22M Mar 27 01:11 /usr/lib64/dri/kms_swrast_dri.so
...


변경 시간으로 찾기

--change-newer-than DURATION 을 사용하면 변경일이 특정일 이후인 파일을 찾을 수 있습니다. DURATION에는 1weeks 나 3months 같이 적어주면 되며 다음은 현재일 기준 변경일이 7일 이후에 변경된 파일을 검색합니다. 

$ fd  --change-newer-than 7days -l

또는 특정 시간을 지정해서 변경일이 그 이후인 파일만 검색할수도 있습니다. 다음은 /tmp 에서  지정한 시간 이후에 변경된 파일을 검색합니다.

$ fd . --change-newer-than '2021-08-23 10:00:00' -l /tmp


반대로 변경일이 특정일 이전인 파일을 찾을 경우 --change-older-than DURATION 을 사용하면 됩니다.  다음은 현재일 기준 변경일이 7일 이전인 파일들을 검색합니다.

$ fd  --change-older-than 7days -l


2가지 옵션을 같이 쓰면 BETWEEN 처럼 사용할 수 있습니다. 다음은 /tmp 아래에서 변경일이 특정 기간인 파일들을 검색합니다.

$ fd . --change-newer-than '2021-08-24 04:30:00'  --change-older-than  '2021-08-25 00:00:00' -l /tmp


같이 보기

Ref