텍스트 파일에서 문자열만 검색하는 방법은 무엇입니까? (재귀적으로)

텍스트 파일에서 문자열만 검색하는 방법은 무엇입니까? (재귀적으로)

폴더의 모든 텍스트 파일을 mimetype별로 나열할 수 있습니다.

find . -type f -print0 | xargs -0 file -i | fgrep -i text | sed 's/:$//g' 2>/dev/null | awk 'BEGIN {FS=": "} {print $1}'

좋아요 하지만 이 파일에서 "STRING"을 검색하기 위해 "fgrep"를 어떻게 추가합니까(정규식이 필요하지 않습니다. 이것이 fgrep의 이유입니다).

이것은 좋지 않습니다:

fgrep -iR "STRING" *

ISO 파일, 바이너리 파일 검색을 시작하기 때문에...

Fedora14/bash.

답변1

첫 번째, : 매뉴얼 페이지에 명시된 대로 grep스위치를 사용하여 바이너리를 검색하지 않도록 지정할 수 있습니다 .-I

-I     Process a binary  file  as  if  it  did  not  contain  matching data;
       this  is  equivalent  to  the --binary-files=without-match option.

두번째, the find: xargs 및 많은 파이프 사용을 피하려면 절차적 -exec테스트를 사용하십시오 find. 다음을 사용하여 논리 테스트 시퀀스를 쉽게 만들 수 있습니다. -exec각 연속 테스트의 연속 실행만약에이전 명령은 모두 0(성공적으로 완료됨)을 반환합니다.

답변2

@rozcietrzewiacz의 솔루션은 좋은 솔루션이지만 여전히 텍스트 파일(에서 반환됨)을 유지하려면 file파일 이름 배열을 신중하게 구축한 다음 grep해당 배열에서 명령을 실행할 수 있습니다.

나는 다음과 같은 점을 갖고 싶습니다.

  • 파일 이름이 없을 때 개행 문자가 있습니다(그러나 공백이 있을 수 있음).
  • file지원 및 옵션 을 -0위한 유틸리티-i
  • \xGNU sed 또는 10진수 문자 코드를 지원하는 sed입니다.

이것은 예이다

#!/bin/bash

get_file_list() {
  local path="$1"
  find "$path" -type f -exec file -0i {} + |
    sed -n '/\x00  *text\//s/\x00.*//p'
}

list=()
while IFS= read -r line; do
  list+=("$line")
done < <(get_file_list .)

# to choose options and pattern
grep -i pattern "${list[@]}"

이 명령은 에서 파일 이름, NUL 바이트 및 MIME 유형으로 구성된 sed일련의 텍스트 줄을 가져옵니다 . file두 번째 부분(NUL 다음)에 단어가 있으면 text/해당 부분을 제거하고 파일 이름만 인쇄합니다. 그렇지 않으면 아무것도 인쇄되지 않습니다.

관련 정보