목차
Linux를 사용할 때 파일을 찾기 위해 자주 사용하는 명령어 중 하나는 find입니다. find의 기능과 사용법을 이해하면 작업 효율성을 높일 수 있습니다. 다음은 특정 예제와 함께 find 사용법을 설명합니다.
1. 기본 개념
find 명령은 지정된 디렉토리 및 하위 디렉토리에서 파일 (일반 파일 및 디렉토리 참조) 을 찾는 데 사용됩니다 .
2. 문법 형식과 공통 매개 변수
2.1 문법 형식
찾기 [경로 ...] [표현식]
그중 경로는 검색 경로이고 여러 경로는 공백으로 구분됩니다. 표현식 : 옵션과 동작으로 구성됩니다.
2.2 공통 매개 변수
-이름 패턴 : 지정된 패턴에 따라 파일을 찾습니다.
-iname 패턴 : -name 매개 변수와 동일하지만 차이점은 대소 문자를 구분하지 않는다는 것입니다.
-type c : 파일 유형 c에 따라 파일을 찾습니다.
그중 c는 파일 유형을 나타내며 가능한 값은 다음과 같습니다.
d : 디렉토리;
f : 일반 파일;
l : 심볼릭 링크;
s : 소켓;
c : 특수 문자 파일;
b : 특수 블록 파일;
p : 명령 파이프 라인 (FIFO)
-ctime n : 지난 n 일 동안 수정 된 파일을 찾습니다.
-cnewer file : 파일 파일보다 최신 파일을 찾습니다 ( "update": 수정 시간을 나타냄).
-exec commond {} \ ;: 찾은 파일에서이 매개 변수에 나열된 쉘 명령을 실행하고 {}와 \ 사이의 공백에주의하십시오.
-ok commond {} \ ;: 기능 및 매개 변수 모드는 -exec와 동일하지만 commond가 실행될 때마다 실행 여부를 묻습니다. 선택하려면 Y / N을 입력하십시오.
세, 예시 설명
3.1 -name / -iname 매개 변수
먼저 현재 디렉토리에 readme.md 파일을 만든 다음 이름이 "* README.md"패턴과 일치하는 파일을 찾습니다.
[root@localhost go]# touch readme.md
[root@localhost go]# find . -name "*README.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
[root@localhost go]#
위의 예에서 볼 수 있듯이 "* README.md"패턴을 만족하는 파일은 모두 찾았지만 소문자 파일 readme.md는 찾을 수 없습니다. -iname 매개 변수를 대체 한 결과를 살펴 보겠습니다.
[root@localhost go]# find . -iname "*ME.md"
./README.md
./misc/trace/README.md
./src/cmd/compile/README.md
./src/cmd/compile/internal/ssa/README.md
./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
./src/cmd/vendor/golang.org/x/sys/unix/README.md
./test/README.md
./readme.md
[root@localhost go]#
보시다시피 소문자 파일 readme.md도 발견되었는데, 이것이 -name과 -iname의 차이점입니다.
PS : Linux에서 i 매개 변수는 종종 명령이 대소 문자를 구분하지 않음을 의미합니다.
3.2 유형 매개 변수
"* src"라는 이름의 모든 디렉토리를 찾습니다.
[root@localhost go]# find . -type d -name "*src"
./src
./src/cmd/api/testdata/src
./src/cmd/go/testdata/modlegacy/src
./src/cmd/internal/src
./src/cmd/link/testdata/testPErsrc
./src/go/build/testdata/withvendor/src
[root@localhost go]#
위의 예에서 볼 수 있듯이 "* src"패턴을 충족하는 모든 디렉토리가 표시되고 조건을 충족하는 일반 파일은 나열되지 않습니다.
"* src"라는 이름의 모든 파일을 찾습니다.
[root@localhost go]# find . -type f -name "*src"
./src/cmd/compile/internal/syntax/testdata/issue20789.src
./src/cmd/compile/internal/syntax/testdata/issue23385.src
./src/cmd/compile/internal/syntax/testdata/issue23434.src
./src/cmd/compile/internal/syntax/testdata/issue31092.src
./src/cmd/compile/internal/syntax/testdata/sample.src
./src/go/parser/testdata/commas.src
./src/go/parser/testdata/issue11377.src
./src/go/parser/testdata/issue23434.src
……
위의 예에서 볼 수 있듯이 "* src"패턴과 일치하는 모든 일반 파일은 디렉토리를 포함하지 않습니다.
3.3 -ctime 매개 변수
먼저 / var / account 아래에 testCtime 파일을 만든 다음 현재 디렉터리에서 마지막 날에 수정 된 파일을 검색합니다.
[root@localhost account]# ls
pacct
[root@localhost account]# touch testCtime
[root@localhost account]# find . -ctime -1
.
./testCtime
[root@localhost account]#
위에서 볼 수 있듯이 "."과 testCtime이 모두 발견되었습니다. 여기서 "."는 현재 디렉토리를 나타냅니다.
3.4 -cnewer 매개 변수
먼저 testOne 및 testTwo 파일 두 개를 만든 다음 testOne보다 최신 파일을 찾기 위해 testdir 디렉터리를 만듭니다.
[root@localhost go]# touch testOne
[root@localhost go]# touch testTwo
[root@localhost go]# mkdir testdir
[root@localhost go]# find . -cnewer testOne
.
./testTwo
./testdir
[root@localhost go]#
위의 쿼리 결과에서 알 수 있듯이 testOne보다 최신 파일을 쿼리 할 수 있습니다 .
3.5 -exec / -ok 매개 변수
현재 디렉토리 및 하위 디렉토리에서 "README.md"패턴과 일치하는 파일을 검색하고 ls -l 명령을 실행하여 결과를 확인합니다.
[root@localhost go]# find . -name "README.md" -exec ls -l {} \;
-rw-r--r--. 1 root root 1607 9月 10 00:57 ./README.md
-rw-r--r--. 1 root root 5066 9月 10 00:57 ./misc/trace/README.md
-rw-r--r--. 1 root root 5655 9月 10 00:57 ./src/cmd/compile/README.md
-rw-r--r--. 1 root root 7945 9月 10 00:57 ./src/cmd/compile/internal/ssa/README.md
-rw-r--r--. 1 root root 2834 9月 10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
-rw-r--r--. 1 root root 98 9月 10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
-rw-r--r--. 1 root root 8678 9月 10 00:57 ./src/cmd/vendor/golang.org/x/sys/unix/README.md
-rw-r--r--. 1 root root 577 9月 10 00:57 ./test/README.md
[root@localhost go]#
위와 동일하게 매개 변수를 -exec에서 -ok로 변경하고 다음과 같이 실행합니다.
[root@localhost go]# find . -name "README.md" -ok ls -l {} \;
< ls ... ./README.md > ? y
-rw-r--r--. 1 root root 1607 9月 10 00:57 ./README.md
< ls ... ./misc/trace/README.md > ? y
-rw-r--r--. 1 root root 5066 9月 10 00:57 ./misc/trace/README.md
< ls ... ./src/cmd/compile/README.md > ? y
-rw-r--r--. 1 root root 5655 9月 10 00:57 ./src/cmd/compile/README.md
< ls ... ./src/cmd/compile/internal/ssa/README.md > ? y
-rw-r--r--. 1 root root 7945 9月 10 00:57 ./src/cmd/compile/internal/ssa/README.md
< ls ... ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md > ? y
-rw-r--r--. 1 root root 2834 9月 10 00:57 ./src/cmd/vendor/github.com/google/pprof/third_party/d3/README.md
< ls ... ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md > ? y
-rw-r--r--. 1 root root 98 9月 10 00:57 ./src/cmd/vendor/github.com/ianlancetaylor/demangle/README.md
< ls ... ./src/cmd/vendor/golang.org/x/sys/unix/README.md > ? N
< ls ... ./test/README.md > ? N
[root@localhost go]#
위의 예에서 볼 수 있듯이 ls -l 명령을 실행할 때마다 실행할 것인지 묻는 메시지가 표시됩니다.
네, 요약
find의 일반적인 매개 변수는 위에 나열되어 있습니다. find 검색은 재귀 검색이라는 점에 유의해야합니다. 예를 들어 현재 디렉토리에서 검색 할 때 기본적으로 현재 디렉토리와 하위 디렉토리에서 파일을 검색합니다.
다섯, 참고 문헌
[1] https://www.runoob.com/linux/linux-comm-find.html
[2] https://man7.org/linux/man-pages/man1/find.1.html