2011-01-07 12 views
17

改行で終わらない通常のテキストファイル(.txt)を表示するにはどうすればよいですか?改行で終わらないファイルを表示するにはどうすればよいですか?

例えば:リスト(出力)このファイル名:

$ cat a.txt 
asdfasdlsad4randomcharsf 
asdfasdfaasdf43randomcharssdf 
$ 

としないリスト(出力)このファイル名:

$ cat b.txt 
asdfasdlsad4randomcharsf 
asdfasdfaasdf43randomcharssdf 

$ 
+0

フォルダの下にあるファイルを幅広く表示したいのですか?あなたの質問は、上記の例ではあまり明確ではありません。 – James

+2

「通常のtxt」は何を意味していますか? *空白行(\ n \ n)で終わるファイルや改行で終わるファイルについて話していますか? 'od -c filename'を使うと、ファイルのあいまいな表現を出力することができます。 – jfs

+1

強調すると、改行は*空白行と同じではありません。改行は1文字です。これは、 "行"と見なす範囲を区切ります。空白行は、文字を含まない単純な "行"です。通常は、2つの連続した改行文字の間には何も置かれません。改行文字で始まるファイルの最初の行です。空白の空白行だけで構成される行を呼び出して、2つの連続した改行文字に空の行という用語を予約する人もいます。あなたはあなたが望むものについて明確にすべきです。 – jw013

答えて

2

これは場しのぎです。誰かが確かにうまくいく可能性があります:

for f in `find . -name '*.txt' -type f`; do 
    if test `tail -c 1 "$f" | od -c | head -n 1 | tail -c 3` != \\n; then 
     echo $f; 
    fi 
done 

N.B.これはタイトルの質問に答えます。これは本文の質問とは異なります(\ n \ nで終わるファイルを探しています)。 ./script dir

例えば:

#!/bin/bash 

for file in `find $1 -type f -name "*.txt"`; 
do 
     nlines=`tail -n 1 $file | grep '^$' | wc -l` 
     if [ $nlines -eq 1 ] 
       then echo $file 
     fi 
done; 

はこのようにそれを呼び出します。

2

これはトリックを行う必要があります./script /home/user/Documents/ - > で終わるすべてのテキストファイルを、\nで終わります。

+0

最初の改良はforの前に 'IFS = $ '\ n"を置くことです。スペースを含むファイルを扱うことができます。 2番目の改善点は、 '$ nlines -eq 1'を' $ nlines -eq 0'に置き換えることです。作者はファイル名を必要とします。**は改行で終わらない**。 –

7

は、この試してみて:

find -type f -exec sh -c '[ -z "$(sed -n "\$p" "$1")" ]' _ {} \; -print 

それは空白行で終わるファイルのファイル名を出力します。空白行で終わらないファイルを印刷するには、-z-nに変更します。

+1

スペースを含むファイル名があれば 'for ... find ... do'を使った答えは失敗します。 –

+1

あなたは 'for .. find..'について正しいですhttp://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29 – jfs

+1

優れた解決策です。 'sh'スクリプトの一部としてエコーしないで、findコマンドの最後に' -print'を追加することをお勧めします。 '-print'は必要なもの(例えば' -print0')に変更することができます。 – squid314

1

別のオプション:

$ find . -name "*.txt" -print0 | xargs -0I {} bash -c '[ -z "$(tail -n 1 {})" ] && echo {}' 
+0

本当にありがとう、これは実際に(OSXの) –

+0

が実際に動作するこのスレッドの例です...実際には、これは正しいファイルを見つけられないようです –

0

あなたの質問は、perlのタグを持っているので、私はそれを使用して答えを投稿します:

check.plは以下の通りです
find . -type f -name '*.txt' -exec perl check.pl {} + 

#!/bin/perl 

use strict; 
use warnings; 

foreach (@ARGV) { 
    open(FILE, $_); 

    seek(FILE, -2, 2); 

    my $c; 

    read(FILE,$c,1); 
    if ($c ne "\n") { 
     print "$_\n"; 
    } 
    close(FILE); 
} 

このperlスクリプトは、パラメータとして渡されたファイルを一度に1つだけ開いて、最後から2文字目を読み込みます。改行文字でない場合は、単にファイル名を出力します。それ以外の場合は何も行いません。 (一致するかしない)と一致するために使用することができ-Mフラグを使用して複数行モードをサポートしてい

+0

最後の文字が改行でない場合それは有効なテキストファイルではありません)? –

17

使用pcregrep、グレップのPerl互換の正規表現版最後の行は、改行を持っていた場合:

pcregrep -LMr '\n$' . 

上記の例では、現在のディレクトリ(.)のファイル(-L)の末尾に改行を検索する()正規表現

の改行を検索することを再帰的に検索します

変更する-L-lには、にはに改行があるファイルがリストされます。

+0

@ dennis-williamsonによって与えられた答えも、スペースがあるファイルでは失敗することを指摘しておきます。少なくともそれは私のためにした。 –

+0

私は、その問題を処理する必要があります私の答えに不足している引用符のセットを追加しました。 –

+1

将来の読者のためのメモ:このpcregrepコマンドは、空の行を含まない*ファイルには適切です。例: 'printf" a \ n \ nb "| pcregrep -M '\ n $' -'は 'a'を出力します(したがって、' -L'で実行すると何も表示されません)。 – maverickwoo

14

[OK]を、それは私の番です、私はそれを試してみる:

find -type f -print0 | xargs -0 -L1 bash -c 'test "$(tail -c 1 "$0")" && echo "No new line at end of $0"' 
1

この例では、OSX上で私の作品(上記の解決策の多くはなかった)

for file in `find . -name "*.java"` 
do 
    result=`od -An -tc -j $(($(ls -l $file | awk '{print $5}') - 1)) $file` 
    last_char=`echo $result | sed 's/ *//'` 
    if [ "$last_char" != "\n" ] 
    then 
    #echo "Last char is .$last_char." 
    echo $file 
    fi 
done 
3

あなたは 'を使用している場合ACK」(http://beyondgrep.com)grepするための代替手段として、あなたはこの実行します。それは実際にすべての行を検索し

ack -v '\n$' 

を行末の改行にマッチしない(-v)改行。

+1

簡単で簡単な解決法。 '-l'を追加すると、行ではなく一致するファイルだけを取得できます。 – stu42j

1

このページのほとんどのソリューションは私にとっては機能しません(FreeBSD 10.3 amd64)。イアン・ウィルの OSXソリューションは、ほとんど、常に動作しますが、従うことはかなり困難ですん: - (

ほとんど-常にあまりにも動作します簡単な解決策があります:($ fはファイルの場合):

SED -i「」-e「$ \」「の$ F」

sedの溶液で大きな問題があります:それはあなただけ(改行を追加していない)を確認する 機会を与えることはありません

上記の両方のソリューションはDOSファイルでは機能しません。 ポータブル/スクリプト可能なソリューションはprobです私が自分で開発した の中でもっとも簡単なものです: -

ここにfile/unix2dos/tailを組み合わせた基本的なshスクリプトです。 生産では、あなたはおそらくこれが誰かの役に立てば幸い

if file $f | grep 'ASCII text' > /dev/null; then 
    if file $f | grep 'CRLF' > /dev/null; then 
     type unix2dos > /dev/null || exit 1 
     dos2unix $f 
     last="`tail -c1 $f`" 
     [ -n "$last" ] && echo >> $f 
     unix2dos $f 
    else 
     last="`tail -c1 $f`" 
     [ -n "$last" ] && echo >> $f 
    fi 
fi 

引用符での「$ F」を使用し、\「$ fが\」として(最後の名前のシェル変数の中に埋め込まれた)テール出力 を取得する必要があります。

関連する問題