사람이 읽을 수있는 파일 이름을 필터링하기 위해 [:print:]( 인쇄 가능 ) 문자 클래스 이름 을 사용할 수 있습니다 . 해당 클래스에 대한 자세한 내용은에 대한 매뉴얼을 참조하십시오 grep.
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
다시 한 번 생각하면 "사람이 읽을 수있는"요구 사항은 파일 이름 대신 파일 내용을 참조 할 수 있습니다. 즉, 텍스트 파일을 검색하는 것 입니다. 좀 더 까다 롭습니다. 주석에서 @D_Bye가 제안한 것처럼 file명령을 사용하여 파일 내용 유형을 결정해야합니다. 그러나 file파일 이름을 표시하는 작업이 복잡해 지므로 파이프 다음 에 실행하는 것은 좋지 않습니다 . 내가 제안하는 것은 다음과 같습니다.
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
다음은 file-part의 작동 방식입니다.
-exec술어가 실행 sh -c 'file -b $0 | grep -q text' FILENAME각각 FILENAME만족 이전의 모든 조건 (종류, 사이즈, 비 실행).
- 그 파일 각각에 대해, 쉘은 (
sh)이 짧은 실행 스크립트를 : file -b $0 | grep -q text, 대체 $0파일 이름으로.
- 그만큼
file프로그램은 각각의 파일의 콘텐츠 타입을 결정하고,이 정보를 출력한다. 이 -b옵션은 테스트 된 각 파일의 이름을 인쇄하지 못하게합니다.
grep 출력을 필터링합니다. file"text"가 포함 된 행을 검색하여 프로그램에서 . (일반적인 file명령 출력 결과를 참조하십시오 .)
- 그러나 (quiet) 옵션이 제공
grep되므로 필터링 된 텍스트를 출력하지 않습니다 -q. 그것이하는 것은 종료 상태를 변경하는 것입니다. 중 하나에 0( "true"로 표현 - 필터링 된 텍스트가 발견되었다) 또는 1 (- 텍스트 "오류"를 의미하는 "텍스트" 의 출력에 표시되지 않았다 file).
- 에서 나오는 참 / 거짓 종료 상태
grep 로 더 전달 sh에 find전체 "의 최종 결과의 역할을 -exec sh -c 'file $0 | grep -q text' {} \;"테스트.
- 경우에는 위의 테스트는 반환 사실 ,
-print(즉, 테스트 파일의 이름이 인쇄되어 있습니다) 명령이 실행됩니다.