리눅스에서 find 만큼 개꿀 명령어가 따로 없는데 의외로 활용을 잘 못하는 경우가 많은 거 같다. 맨날 들어가는 디렉터리만 들어가서 cd, ls로 노가다해서 파일 찾는 것보다는 find로 찾는 게 간단하고 정확하다.
옵션을 어떻게 줄 것인가가 관건인데 이 글에선 -name, -iname, -type, *, ? 정도를 정리한다. 이 정도만 알아도 어지간한건 다 찾을 수 있다.
find
리눅스에서 find는 문자 뜻 그대로 파일을 찾아주는 명령어다. 찾을 경로를 정하고 적절한 옵션을 세팅하면 그에 맞는 파일을 찾아서 그 파일의 경로를 출력한다.
find [경로] [옵션] [표현식]
-name, -iname
실습을 위해 간단하게 디렉터리와 파일 몇 개를 만들었다.
가장 단순한 형태는
[root@localhost find_test]# find . -name file1
./dir1/dir1-1/file1
이렇게 현재 경로(.)를 기준으로 하위 디렉터리를 포함해 정확히 일치하는 파일명을 찾는 것이다.
근데 -name은 대소문자를 구별하기 때문에 file1로 검색하면 File1을 찾지 못한다. 반면
[root@localhost find_test]# find . -iname file1
./dir1/dir1-1/file1
./dir1/File1
이런 식으로 -iname 를 쓰면 대소문자를 구별하지 않고 파일을 찾아준다. 개인적으론 iname이 쓰기 좀 더 편한 거 같다.
*, ?
검색하면 빠질 수가 없는게 패턴 검색인데 예를 들어 file로 시작하는 모든 파일을 찾고 싶을 때 쓸 수 있다. 이것도 활용도가 높기 때문에 무조건 알아야 된다고 보면 된다.
[root@localhost find_test]# find . -iname "file?"
./dir1/dir1-1/file1
./dir1/File1
./dir2/File2
./dir2/File3
./dir2/File4
먼저 ? 부터 보면 file 다음에 한 글자가 포함된 모든 파일을 찾는다. 그래서 file1, file2, file3, file4 를 모두 찾은 걸 볼 수 있다.
또 하나 중요한 건 그냥 찾을 때랑 달리 “”를 붙였다는 건데 *나 ?를 쓸 땐 반드시 따옴표 안에 넣어서 검색해야 된다.
[root@localhost find_test]# find . -iname "file*"
./dir1/dir1-1/file1
./dir1/File1
./dir1/File1-1
./dir2/File2
./dir2/File3
./dir2/File4
*도 같은 방법으로 쓰면 된다. 이번엔 “file?”로 찾지 못한 File1-1 이라는 파일까지 찾았다는 차이가 있는데 *는 뒤에 한 단어가 와도 찾고 두 단어 이상이 와도 모두 찾기 때문이다.
결론적으로 관련 파일이 너무 많아서 아주 정밀하게 찾는 게 아니라면
find . -iname "file*"
같은 형태로 찾는 게 좀 더 쉽게 찾는 거 같다.
-type
개인적으론 많이 쓰진 않지만 -type 옵션을 쓰면 검색 결과를 디렉터리나 파일로 한정할 수 있다.
예를 들어
[root@localhost find_test]# find . -iname "dir*" -type d
./dir1
./dir1/dir1-1
./dir2
이렇게 -type d 를 붙이면 디렉터리만 찾는다.
[root@localhost find_test]# find . -iname "dir*" -type f
-type f 는 파일만 찾는다. dir로 시작하는 파일은 없기 때문에 아무것도 출력하지 않는 걸 볼 수 있다.
찾는 경로는 되도록 /로 하지 않는다
이건 권고 인데 찾는 위치를 지정할 때 왠만하면 루트 디렉터리(/)는 안 쓰는 게 좋다.
[root@localhost find_test]# find / -iname "dir*"
일단 /로 찾으면 리눅스에 있는 모든 경로를 대상으로 찾으라는 뜻이기 때문에 오래 걸린다. 그리고 컴퓨터 리소스 상태가 맛이 간 상태에서 이렇게 돌리다가 아주 재수가 없으면 서비스가 뻗을 수도 있다.
찾는 파일이 있더라도 대략적인 위치 정도는 가늠할 수 있기 때문에 해당 위치를 기준으로 찾는 게 더 빠르고 보기도 편하다.