정규식으로 검색하는 것과 grep으로 찾는 것 중 어느 것이 더 낫습니까?

정규식으로 검색하는 것과 grep으로 찾는 것 중 어느 것이 더 낫습니까?

모든 하위 디렉터리에서 파일을 재귀적으로 검색하는 두 가지 방법 중 어느 것이 더 빠르고 더 좋습니까?

find . -regex ".*/.*abc.*"

또는

find . | grep ".*abc.*"

답변1

UNIX 파일 이름은 일반적으로 0x00(NULL) 및 0x2F(/)를 제외하고 옥텟(8비트 바이트)으로 구성될 수 있습니다. 다른 모든 옥텟은 유효합니다. 여기에는 0x0A(개행 문자)와 같은 좋은 내용이 포함됩니다.

귀하의 find예제는 이상한 문자(예: 개행 문자)가 포함된 파일 이름을 올바르게 처리합니다.

find | grep이와 같은 상황에 직면하면 귀하의 예는 이상하고 잘못된 결과를 제공할 것입니다.하나"Line 1\nLine 2"라는 파일은 다음과 같습니다.문서).

사용할 수 있습니다 find -print0 | grep -z(예를 들어 Linux에서 GNU 버전을 사용하는 경우). 그러면 정확성이 유지됩니다. 더 많은 메모리를 사용하게 됩니다. 옵션을 사용하여 find에게 확장 정규식(예:)을 사용하도록 지시할 수 있습니다 -regextype.

매우 복잡한 일치 작업을 수행하려는 경우 명령줄을 짧은 Perl 프로그램으로 변환한 다음 편집하여 복잡성을 추가할 수 있는 이 find2perl스크립트가 마음에 들 것입니다.find

답변2

find . -regex ".*/.*abc.*"모든 데이터 를 find . | grep ".*abc.*"생성 하여 . 파일 이름에 공백이 있는 드문 경우에도 작동하므로 더욱 안정적입니다.findgrepfind . -regex ".*/.*abc.*"

두 명령 모두 전체 경로 include 를 찾습니다 abc. 여기에는 이름이 포함된 파일뿐만 아니라 abc이름이 포함된 디렉터리에 포함된 파일도 포함됩니다 abc. 이름에 가 포함된 파일만 찾으려면 abc다음을 사용하십시오.

find -name '*abc*'

ksh, bash 또는 zsh에서는 echo **/*abc*대신 다음을 실행할 수 있습니다. **/모든 하위 디렉터리를 재귀적으로 봅니다. ksh에서는 먼저 set -o globstar실행(에 넣어야 함 ) 해야 합니다 ~/.kshrc. Bash에서는 먼저 shopt -s globstar실행(에 넣어야 함 ) 해야 합니다 ~/.bashrc.

답변3

패턴 일치를 사용하는 경우 find추가 조건자 또는 동작을 추가할 수 있습니다.

# look only for matching directories
find . -regex ".*/.*abc.*" -type d

# run a command on each match
find . -regex ".*/.*abc.*" -exec echo 'I found a file named {}' ';'

find프로세스를 생성하거나 파이프를 수행할 필요가 없으므로 검색만 수행하는 것이 더 빠를 수도 있지만 grep알아차릴 수 있을지는 의문입니다.

관련 정보