폴더의 모든 텍스트 파일을 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
\x
GNU 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/
해당 부분을 제거하고 파일 이름만 인쇄합니다. 그렇지 않으면 아무것도 인쇄되지 않습니다.