디렉터리에 있는 수천 개의 파일 중에서 한 파일에서 수백 개의 문자열을 찾는 방법

디렉터리에 있는 수천 개의 파일 중에서 한 파일에서 수백 개의 문자열을 찾는 방법

성명서를 쓰려고 하는데 grep정말 죽겠어요. 나는 또한 arguments list too long오류가 발생하는 것에 지쳤습니다. 파일이 있는데 이름을 로 지정하겠습니다 subset.txt. 여기에는 특정 문자열(예: )이 포함된 수백 개의 줄이 포함되어 있습니다 . 내 개체 디렉터리에는 수천 개의 파일이 있으며 나열된 문자열이 포함된 모든 파일을 다른 디렉터리에 MO43312948복사해야 합니다 .subset.txt

여기서는 개체 디렉터리에서 일치하는 파일만 반환하여 시작하려고 합니다.

grep -F "$(subset.txt)" /objects/*

계속 "bash: /bin/grep: 인수 목록이 너무 깁니다"라는 메시지가 나타납니다.

답변1

grep대상 으로 디렉토리를 전달 -R하고 입력 스키마 파일을 전달할 수 있습니다 -f.

  -f FILE, --file=FILE
          Obtain patterns from FILE, one per line.  If this option is used
          multiple  times  or  is  combined with the -e (--regexp) option,
          search for all patterns given.  The  empty  file  contains  zero
          patterns, and therefore matches nothing.

   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

그래서 당신은 다음을 찾고 있습니다 :

grep -Ff subset.txt -r objects/

다음을 사용하여 일치하는 파일 목록을 얻을 수 있습니다.

grep -Flf subset.txt -r objects/

따라서 최종 목록이 너무 길지 않다면 다음을 수행할 수 있습니다.

 mv $(grep -Flf subset.txt -r objects/) new_dir/

argument list too long오류가 반환 되면 다음을 사용하세요.

grep -Flf subset.txt -r objects/ | xargs -I{} mv {} bar/

파일 이름에 공백이나 기타 이상한 문자가 포함될 수 있는 경우 다음을 사용하십시오(GNU 가정 grep):

grep -FZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

마지막으로 바이너리를 제외하려면 다음을 사용하세요.

grep -IFZlf subset.txt -r objects/ | xargs -0I{} mv {} bar/

답변2

사용

grep -F -f subset.txt 

grep에게 subset.txt파일을 읽도록 지시합니다.

find를 사용하여 파일을 반복할 수 있습니다.

find . -type f -exec grep -F -f subset.txt {} \;

또는

find . -type f -exec grep -F -f subset.txt {}  +

답변3

grep 속도를 더욱 높이려면 실행하기 전에 "LC_ALL=c"를 사용하여 셸에서 로케일을 설정할 수 있습니다. 이는 grep에 상속되어 필요하지 않은 경우 유니코드 처리를 비활성화하며 경우에 따라 grep 속도를 크게 높일 수 있습니다. 이를 문서화한 훌륭한 블로그는 다음에서 찾을 수 있습니다.http://www.inmotionhosting.com/support/website/ssh/speed-up-grep-searches-with-lc-all. 이 트릭은 grep뿐만 아니라 bash 쉘 스크립트의 속도도 높일 수 있습니다.

관련 정보