두 번째 줄이 특정 정규식과 정확히 일치하는 디렉터리의 모든 파일을 (재귀적으로) 나열하고 싶습니다. 총 파일 수는 약 60K입니다.
지금까지 나는 다음 명령을 작성했습니다:
find /path -type f | xargs --no-run-if-empty -n1000 awk 'FNR = 2 && $0 ~ /^regular expression$/ {print FILENAME; nextfile}'
.
효율성이 향상될 수 있나요?
답변1
=
먼저 올바르게 사용하는 대신 잘못 사용하고 있음을 알아두십시오 ==
.
그럴 필요는 없습니다 xargs
. 그냥 실행하면 됩니다 find
. 또한 awk
전체 파일을 읽는 것이 아니라 2행을 처리한 후 즉시 종료해야 합니다.
find /path -type f -exec awk 'FNR == 2 && /^regular expression$/ {print FILENAME}; FNR == 2 {nextfile}' '{}' +
인수 +
끝에 있는 -exec
지시문은 find
가능한 한 많은 파일 이름 인수를 배치합니다. 라 라 xargs
. 바라보다find
문서.
여기서 중요한 점은 입니다 FNR==2 {nextfile}
.
(그러나 가능한 경우 &를 사용하는 -exec
것보다) 더 나은지 여부는 논쟁의 여지가 있습니다. 한편으로는 이전 배치를 확인하는 동안 더 많은 파일 이름을 읽을 수 있도록 허용함으로써 어느 정도의 병렬 처리가 달성됩니다 . 반면에 병렬화로 인해 불량 디스크가 디스크 의 다른 트랙과 경쟁하게 될 수 있습니다. 하드웨어(캐시 크기, SSD 등)에 따라 이 내용이 변경됩니다. 그런 다음 프로필이 결정합니다.xargs
-print0
-0
find … | xargs …
find
awk
awk
find
답변2
당신은 시도 할 수 있습니다:
grep -n <reg expr> /path/to/* | grep ":2:" | cut -d ':' -f1
:2:
그것의 일부가 아닌 한 <reg expr>
.
-x
전체 라인 일치도 있습니다 .
이것이 더 빠른지는 확실하지 않습니다. 테스트할 파일이 60,000개가 없습니다.]