'find' 파일을 반복하고 'grep'을 사용하여 문자 세트 결과를 파일로 저장(stdin)

'find' 파일을 반복하고 'grep'을 사용하여 문자 세트 결과를 파일로 저장(stdin)

나는 그것을 사용하고 있다find분석 파일 목록입니다. ASCII 파일이 아닌 파일을 인식하고 싶습니다.

이것이 내가 명령줄에서 시도한 것입니다:

for me in `find 2022*`; do file -i $me | grep -L 'ascii'  ; done;

산출:

(standard input)
(standard input)
(standard input)
(standard input)
(standard input)
(standard input)
(standard input)

숫자 standard input(7)은 제출된 200개 파일 중에서 실제로 올바른 파일을 찾았음을 정확하게 표시하지만 파일 자체의 이름이 필요합니다.

어떻게 해야 하나요?

답변1

file파일 이름은 이미 인쇄되어 있으므로 간단한 grep 후에 잘라야 합니다. 파일이 동일한 디렉터리에 있는 경우:

file -i * | grep -v 'charset.*ascii' | cut -d: -f1

bash셸 내에서 파일을 더 많은 하위 디렉터리와 일치시키는 경우 :

shopt -s globstar
file -i 2022** | grep -v 'charset.*ascii' | cut -d: -f1

또는 다음을 사용하십시오 find.

find 2022* -type f -exec sh -c 'file -i "$@" | grep -v 'ascii' | cut -d: -f1' sh {} +

파일 이름에 콜론( 파일 이름을 나머지 파일과 분리하는 :데 사용됨 )이나 개행 문자가 있는 파일 이름 또는 파일 이름이 일치 하지만 파일이 ASCII가 아닌 경우가 있습니다. 이러한 경우를 처리하는 다른 버전은 다음과 같습니다(Null 분리가 지원된다고 가정).filegrepcharset.*ascii

file -00i * | awk -v RS='\0' -v ORS='\n' 'NF%2{f=$0;next} !/ascii/{print f}'

filewith는 -00파일 이름 끝과 줄 끝에 널 바이트를 배치합니다. 그래서 우리는 짝수 라인만 테스트하고 일치하는 것이 없으면 이전 라인(파일 이름)을 인쇄합니다.

답변2

데이터를 grep의 표준 입력으로 파이프하므로 grep에는 인쇄할 파일 이름이 없습니다.

2022*디렉토리가 아니라 파일 이름이라고 가정합니다 .

find . -type f -name '2022*' -exec sh -c '
    for file; do
        file -bi "$file" | grep -q ascii || echo "$file"
    done
' sh '{}' +

관련 정보