각각 수천 개의 파일이 포함된 두 개의 디렉토리가 있고 파일에서 특정 IP를 수집하려고 합니다. 내 grep 문자열은 다음과 같습니다
grep "IP" cdr/173/07/cdr_2018_07*
이 grep 문자열은 "grep: 인수 목록이 너무 김"을 반환합니다. 그러나 다음을 수행할 때:
grep "IP" cdr/173/06/cdr_2018_06*
내가 찾고 있는 것을 반환합니다.
아래는 각 디렉토리의 상위 디렉토리에 대한 ls -l입니다. 차이가 약 400KB인 것 같으니 여기서는 크기가 실제로 문제인지 잘 모르겠습니다. 내가 뭐 놓친 거 없니?
jeblin@debian:~$ ls -l cdr/173
total 18500
REDACTED
drwxr-xr-x 2 jeblin jeblin 2781184 Jul 2 09:34 06
drwxr-xr-x 2 jeblin jeblin 2826240 Aug 1 07:33 07
차이점이 있다면 이 프로세스(여러 IP 검색)를 자동화하기 위해 Python 스크립트를 작성했는데 06에서는 작동했지만 07에서는 작동하지 않았기 때문에 처음으로 수동 grep 검색을 시도했습니다.
답변1
쉘이 호출할 수 없는 파일이 너무 많거나, 오히려 외부 유틸리티를 호출하는 데 사용되는 명령줄 길이에 제한이 있으며1, 쉘grep
이 확장된 글로빙 패턴을 사용하여 호출하려고 할 때 충돌합니다.grep
cdr/173/07/cdr_2018_07*
당신이 할 수 있는 일은 각 파일을 개별적으로 grep하는 것입니다.
for pathname in cdr/173/07/cdr_2018_07*; do
grep "IP" "$pathname" /dev/null
done
여기서 extra는 일치하는 파일의 파일 이름을 항상 보고하도록 /dev/null
강제하거나 다음을 사용할 수 있습니다 .grep
find
find cdr/173/07 -maxdepth 1 -type f -name 'cdr_2018_07*' \
-exec grep "IP" /dev/null {} +
grep
가능한 한 많은 일치하는 경로 이름을 사용하여 호출이 이루어지므로 이 방법이 더 효율적입니다.가능한 한 많이일괄적으로.
cd
처음 에 들어가서 cdr/173/07
해보면 그럴 수도 있어요.
grep "IP" cdr_2018_07*
그것가능한디렉토리 비트를 포함하지 않기 때문에 결과 파일 이름 목록이 더 짧아질 수 있으므로 아마도 44.7k 파일의 한계에 매우 가까울 것이므로 특히 숫자가 예상되는 경우 이 작업을 수행하는 다른 방법으로 이동하는 것을 심각하게 고려해야 합니다. 파일 수가 해당 숫자 주위에서 변동합니다.
관련된:
1 제한은 명령줄의 길이와환경(각 인수의 길이와 환경 변수의 이름 및 값의 합계, 해당 포인터도 고려) 이는 execve()
외부 명령을 실행하기 위해 쉘에서 사용하는 시스템 호출에 의해 부과되는 제한입니다. 등과 같은 내장 명령에는 echo
이 문제가 없습니다.
답변2
문제는 쉘 명령에 허용되는 최대 바이트 수에 대한 제한입니다.
*
디렉터리에 있는 모든 파일의 전체 목록으로 확장되므로 중요한 파일 크기가 아니라 파일 이름 길이와 파일 수가 중요합니다.
를 실행하여 컴퓨터의 바이트 제한을 확인할 수 있습니다 $ getconf ARG_MAX
. 이 제한은 셸 자체가 아닌 운영 체제/커널에 의해 적용됩니다.
이를 방지하는 한 가지 방법은 find를 사용하는 것입니다.
$ find cdr/173/07/ -iname "cdr_2018_07*" -type f -exec grep "IP" {} \;
답변3
나는 다음 사항을 바탕으로 질문에 대답하고 있습니다. - 두 개의 디렉토리가 있습니다. - 1)cdr/173/07 2)cdr/173/06
이 두 디렉토리에는 검색해야 할 파일이 많이 있을 수 있습니다.
a) 아래는 첫 번째 해결 방법입니다.
grep -r "IP" cdr/173/07 -e "IP" cdr/173/06
b) 그러나 다른 많은 디렉토리를 검색하려면 다음을 사용할 수 있습니다.
grep -r "IP" cdr/173/*
c) 1000개의 파일이 있고 특정 유형의 파일만 검색한다고 가정합니다. grep -r "IP" cdr/173/07/cdr_2018_07* -e grep "IP" cdr/173/06/cdr_2018_06*