最後に空行がないファイルを見つける方法は?

最後に空行がないファイルを見つける方法は?

現在、ディレクトリのサブディレクトリには末尾に改行文字がある場合とない場合があるファイルがあります。最後に改行文字のないファイルを見つける方法は?

私はこれを試しました:

find . -name '*.styl' | while read file; do
    awk 'END{print}' $file | grep -E '^$' > /dev/null || echo $file;
done

しかし、うまくいきません。 awk 'END{print}' $fileと同様に、空の新しい行の前に行を印刷しますtail -n 1 $file

ベストアンサー1

明確にするために、LF(別名\n改行文字)文字は次の行です。区切り記号、これは行区切り文字ではありません。改行文字で終わらない限り、行は終わりません。埋め込みファイルにはa\nb最後の行の後に文字が含まれているため、有効なテキストファイルではありません。空でない行が1つだけ含まれるファイルの場合aa\n

したがって、1 つ以上の空行で終わるファイルには、2 つの改行で終わるか、1 つの改行が含まれます。

場合:

 tail -c 2 file | od -An -vtc

出力\nまたは\n \nファイルには、少なくとも1つの末尾の空行が含まれています。何も出力しない場合は空のファイルで、出力すると<anything-but-\0> \n空でない行で終わります。それ以外はテキストファイルではありません。

これで空の行で終わるファイルを見つけるには、ファイルの最後の2バイトのみを読み取るために機能します(特に大容量ファイルの場合)。しかし、まず、出力をプログラムで解析するのは簡単ではありません。ある実装から次の実装まで一貫性がないため、各ファイルに対して1つずつod実行する必要があります。tailod

find . -type f -size +0 -exec gawk '
  ENDFILE{if ($0 == "") print FILENAME}' {} +

(空行で終わるファイルを見つける)は、できるだけ少ない数のコマンドを実行しますが、これはすべてのファイルの内容全体を読むことを意味します。

理想的には、それ自体がファイルの終わりを読むことができるシェルが必要です。

そしてzsh

zmodload zsh/system
for f (**/*(D.L+0)) {
  {
    sysseek -w end -2
    sysread
    [[ $REPLY = $'\n' || $REPLY = $'\n\n' ]] && print -r -- $f
  } < $f
}

おすすめ記事