주어진 문자열로 시작하는 모든 파일을 빠르게 찾습니다.

주어진 문자열로 시작하는 모든 파일을 빠르게 찾습니다.

깨진 Cygwin 심볼릭 링크를 찾는 명령을 작성 중입니다.

지금은 다음을 사용하고 있습니다.

egrep -rnw . -e "^\!<symlink>"

하지만 이는 별로 효율적이지 않습니다. 파일이 다음으로 시작하는지에만 관심이 있지만 !<symlink>파일 grep의 나머지 부분을 계속 검색합니다.

콘텐츠 접두어로 파일을 효율적으로 검색할 수 있는 방법이 있습니까?

답변1

다른 답변과 의견을 바탕으로

find . -type f -exec awk '/^!<symlink>/ {print FILENAME} {nextfile}' {} +

를 사용하기 때문에 가능한 한 적은 횟수로 -exec … +실행됩니다 awk(최대 매개변수 목록 크기를 기준으로). awk정규식(예: 검색 문자열)과 일치하는 줄을 찾으면 파일 이름을 인쇄합니다 . (문자열을 작은따옴표로 묶으면 백슬래시( \)가 필요하지 않습니다.) 당연히 줄의 내용도 보려면 다음과 같이 말할 수 있습니다.

{print FILENAME; print}

또는

{print FILENAME ": " $0}

그런 다음 무조건 다음 파일로 이동하므로 실제로는 각 파일의 첫 번째 줄만 살펴봅니다. 참고: nextfile정의가 없는 것 같습니다.POSIX;GNU에만 존재할 수도 있습니다 awk.

답변2

어때요?

find . -type f -exec head -1v {} + | egrep -B 2 -nw -e "^\!<symlink>"

답변3

또한 다른 아이디어를 기반으로 합니다.

그것에 대해 생각해 본 적 있나요 xargs? 어느 정도 병렬화를 수행할 수 있습니다.

find . -type f -print0 | xargs -0 -P4 head -1 | egrep -wn "^\!<symlink>"

기능: 모든 일반 파일을 찾아 파일 목록을 공백 대신 "\0"으로 구분합니다.
xargs에게 "\0"이 구분 기호임을 이해하고 4개의 동시 프로세스를 실행하도록 지시합니다(코어 수와 디스크 속도에 맞게 조정됨). Xargs는 각 파일에 대해 head 명령을 실행합니다.
마지막으로 패턴을 사용하여 결과를 쿼리합니다.

머리는 여전히 많은 시간 동안 작동할 것입니다. 하지만 동시에! 이런 종류의 일반 검색을 수행해야 하는 경우가 아니라면 더 이상 최적화하려고 노력하지 않을 것입니다. 어쨌든 한 번만 실행하면 더 빠른 런타임이 더 많은 최적화에 걸리는 시간을 얻지 못할 것입니다.

관련 정보