Linux find 를 대체하는 fd 명령어 사용법
fd 는 file system 에서 특정 엔트리를 찾는 명령어로 find 보다 더 사용자 친화적이며 속도도 빠릅니다.
물론 find 보다 옵션이나 기능이 적긴 하지만 많이 사용하는 사례에 대해 합리적인 기능을 제공합니다.
설치
패키지 매니저 사용
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 를 사용하면 크기를 지정해서 검색할 수 있습니다. > 는 기호를 < 는 기호를 사용해서 이상과 미만을 표시할 수 있습니다.
다음은 /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