모든 하위 디렉터리에서 파일을 재귀적으로 검색하는 두 가지 방법 중 어느 것이 더 빠르고 더 좋습니까?
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.*"
생성 하여 . 파일 이름에 공백이 있는 드문 경우에도 작동하므로 더욱 안정적입니다.find
grep
find . -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
알아차릴 수 있을지는 의문입니다.