特定の長さの文字列のみを含むすべてのファイルを検索する

特定の長さの文字列のみを含むすべてのファイルを検索する

私は8文字の文字列を含み、他のファイルは含まれていないファイルを見つけようとして複数のファイルを検索しています。

私が今まで試したこと: -

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

それは正確に8文字の文字列を含むファイルを示していますが、8文字だけでなく他の多くのものを含むファイルも表示します。私は正確に8文字の文字列を含むファイルが欲しいです。

どんな助けでも大変感謝します。ありがとうございます。

答え1

長さ9バイト、8文字、改行文字のファイルを探しています。これは単一バイト文字のみを探していると仮定します。

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

これは、現在のディレクトリ内またはその下で、長さが正確に9バイトのすべての一般的なファイルを探します。 1行だけが含まれていることを確認するために、grep8つの文字を含む行を正確に一致させようとします。grep一致するファイルの名前を出力するには、対応するオプションを使用します-l

答え2

GNU を使用して、awk正確に 8 文字で構成される 1 行だけを含む一般ファイルを検索します (改行文字がある場合を除く)。

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

関連情報