[linux] Linux 명령 : 텍스트 파일 만 ‘찾기’방법은 무엇입니까?

Google에서 몇 번 검색 한 후 다음과 같은 결과를 얻었습니다.

find my_folder -type f -exec grep -l "needle text" {} \; -exec file {} \; | grep text

매우 불편하고 MIME 유형 정보와 같은 불필요한 텍스트를 출력합니다. 더 나은 솔루션이 있습니까? 검색해야하는 많은 텍스트 파일과 함께 동일한 폴더에 많은 이미지와 기타 바이너리 파일이 있습니다.



답변

나는 이것이 오래된 스레드라는 것을 알고 있지만 그것을 우연히 발견하고 find바이너리가 아닌 파일 만 찾는 데 사용하는 매우 빠른 방법 인 내 방법을 공유 할 것이라고 생각했습니다 .

find . -type f -exec grep -Iq . {} \; -print

-I그렙에 대한 옵션은 즉시 바이너리 파일과 무시하도록 지시 .과 함께 옵션을 -q즉시 확인이 매우 빠르게 진행 있도록 텍스트 파일을 일치합니다. 공백이 염려되는 경우 -print를 a -print0로 변경할 수 있습니다 xargs -0(팁 @ lucas.werkmeister!).

또한 첫 번째 점은 findOS X와 ​​같은 특정 BSD 버전에만 필요 하지만 별칭이나 무언가에 넣으려는 경우 항상 거기에 두는 것만으로도 손상되지 않습니다.

편집 : @ruslan이 올바르게 지적했듯이은 암시 적이므로 -and생략 할 수 있습니다.


답변

이 SO 질문을 바탕으로 :

grep -rIl "needle text" my_folder


답변

왜 불편한가요? 자주 사용해야하고 매번 타자하고 싶지 않은 경우 bash 함수를 정의하면됩니다.

function findTextInAsciiFiles {
    # usage: findTextInAsciiFiles DIRECTORY NEEDLE_TEXT
    find "$1" -type f -exec grep -l "$2" {} \; -exec file {} \; | grep text
}

그것을 넣고 .bashrc실행하십시오.

findTextInAsciiFiles your_folder "needle text"

당신이 원할 때마다.


편집은 영업 이익의 편집을 반영하기 :

MIME 정보를 잘라내려면 MIME 정보를 필터링하는 파이프 라인에 추가 단계를 추가하면됩니다. 이것은 앞에 오는 것만 취함으로써 트릭을 수행해야합니다 :: cut -d':' -f1:

function findTextInAsciiFiles {
    # usage: findTextInAsciiFiles DIRECTORY NEEDLE_TEXT
    find "$1" -type f -exec grep -l "$2" {} \; -exec file {} \; | grep text | cut -d ':' -f1
}


답변

find . -type f -print0 | xargs -0 file | grep -P text | cut -d: -f1 | xargs grep -Pil "search"

이것은 안타깝게도 공간 절약이 아닙니다. 이것을 bash 스크립트에 넣으면 조금 더 쉬워집니다.

이것은 공간 안전입니다.

#!/bin/bash
#if [ ! "$1" ] ; then
    echo "Usage: $0 <search>";
    exit
fi

find . -type f -print0 \
  | xargs -0 file \
  | grep -P text \
  | cut -d: -f1 \
  | xargs -i% grep -Pil "$1" "%"


답변

이를 수행하는 또 다른 방법 :

# find . |xargs file {} \; |grep "ASCII text"

빈 파일도 원하는 경우 :

#  find . |xargs file {} \; |egrep "ASCII text|empty"


답변

이건 어때요:

$ grep -rl "needle text" my_folder | tr '\n' '\0' | xargs -r -0 file | grep -e ':[^:]*text[^:]*$' | grep -v -e 'executable'

파일 유형없이 파일 이름을 원하면 최종 sed필터를 추가하기 만하면 됩니다.

$ grep -rl "needle text" my_folder | tr '\n' '\0' | xargs -r -0 file | grep -e ':[^:]*text[^:]*$' | grep -v -e 'executable' | sed 's|:[^:]*$||'

-e 'type'마지막 grep명령에 더 많은 옵션을 추가하여 불필요한 파일 유형을 필터링 할 수 있습니다 .

편집하다:

xargs버전이 -d옵션을 지원하는 경우 위의 명령이 더 간단 해집니다.

$ grep -rl "needle text" my_folder | xargs -d '\n' -r file | grep -e ':[^:]*text[^:]*$' | grep -v -e 'executable' | sed 's|:[^:]*$||'


답변

내가 한 방법은 다음과 같습니다 …

1 . 파일이 일반 텍스트인지 테스트하는 작은 스크립트를 만듭니다.

#!/bin/bash
[[ "$(file -bi $1)" == *"file"* ]]

2. 이전과 같이 find 사용

find . -type f -exec istext {} \; -exec grep -nHi mystring {} \;