특정 길이의 문자열만 포함하는 모든 파일 검색

특정 길이의 문자열만 포함하는 모든 파일 검색

나는 8자 문자열을 포함하고 다른 파일은 포함하지 않는 파일을 찾으려고 여러 파일을 검색하고 있습니다.

내가 지금까지 시도한 것 :-

grep -x '.\{8,8\}'

그것은 정확히 8자의 문자열을 포함하는 파일을 보여주지만, 8자뿐만 아니라 다른 많은 것들을 포함하는 파일도 보여줍니다. 나는 정확히 8자의 문자열을 포함하는 파일을 원합니다.

어떤 도움이라도 대단히 감사하겠습니다. 감사해요.

답변1

당신은 길이가 9바이트, 8자, 개행 문자인 파일을 찾고 있습니다. 이는 단일 바이트 문자만 찾고 있다고 가정합니다.

find . -type f -size 9c -exec grep -l -E '^.{8}$' {} +

이는 현재 디렉토리 내 또는 그 아래에서 길이가 정확히 9바이트인 모든 일반 파일을 찾습니다. 한 줄만 포함되어 있는지 확인하기 위해 반복하여 grep정확히 8개의 문자가 포함된 줄을 일치시키려고 합니다. grep일치하는 파일의 이름을 출력하기 위해 해당 옵션을 사용합니다 -l.

답변2

GNU를 사용하여 awk정확히 8자로 구성된 한 줄만 포함하는 일반 파일을 찾습니다(개행 문자가 있는 경우 제외).

find . -type f -size +7c -size -50c -exec gawk '
  BEGINFILE               {p = 0}
  FNR == 1 && length == 8 {p = 1}
  FNR == 2                {p = 0; nextfile}
  ENDFILE                 {if (p) print FILENAME}' {} +

find를 사용하여 파일 크기를 8~49바이트로 제한합니다. 8은 8개의 1바이트 문자가 있고 줄 바꿈이 없는 파일을 의미하고, 49는 8개의 6바이트 문자(UTF-8의 최대값, 다른 문자 세트에 적응해야 할 수 있음)와 줄 바꿈을 의미합니다.

또는 다음을 사용하여 zsh:

has_one_line_of_8_characters() {
  local c
  ! read -ru0 -k10 c && [[ $c =~ $'^[^\n]{8}\n?$' ]]
} < ${1-$REPLY}

printf '%s\n' **/*(.DL+7L-50+has_one_line_of_8_characters)

답변3

gawk '/^.{9}$/{print FILENAME}' RS='\0' *

8자 + 줄 끝의 개행 문자 = 총 9자이기 때문에 9자를 선택했습니다. 8개의 문자(개행 포함)가 꼭 필요한 경우 패턴에 8개의 숫자를 사용해야 합니다.

시험

내 테스트 폴더에는 4개의 파일이 있습니다.

$ tail -n +1 -- *
==> 11_chars <==
zzzzzzzzzz

==> 5_chars <==
zzzz

==> 7_chars <==
zzzzzz

==> 9_chars <==
zzzzzzzz

산출

$ gawk '/^.{9}$/{print FILENAME}' RS='\0' *
9_chars

관련 정보