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!).
또한 첫 번째 점은 find
OS 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 {} \;