2013-01-24 5 views
5

ファイル拡張子の制約がなくても、私のLinuxマシンで人間が読めるファイルを探したいと思っています。これらのファイルは、テキスト、構成、html、ソースコードなどの人間の感知ファイルでなければなりません。フィルタリングして見つける方法を提案できますか?Unix上で人間が読めるファイルを見つける

+1

などのフォーマットを持っています'file'ユーティリティは、ファイル内のコンテンツのタイプを判断するのに非常に優れています。おそらく、あなたはこのファイルを使用してその出力に基づいてファイルをフィルタリングすることができます。 – cdhowie

+0

AFAIKのみWindowsはファイル拡張子を信頼します。 UNIXのようなOSは 'file'を使います。とにかく、 "人間が読める"と定義する必要があります。 – m0skit0

+0

これはどれくらい正確にする必要がありますか?そして、あなたはシステム内のあらゆるファイルを探していますか、あるいはシステムの選択された部分だけを探していますか?システムに何千台ものディスクが接続されている場合、実際にすべてのファイルを読み取るのにどれくらいの時間がかかるので、何時間も待つことは可能ですか? –

答えて

6

検索とファイルはここにあなたの友達です:

find /dir/to/search -type f -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print 

が、これは任意のファイルを検索します(注:これは、シンボリックリンクディレクトリソケットなどのみ通常のファイルを見つけることができません)へ/検索と実行のsh// DIRに - c 'ファイル-b {} | grep text &>/dev/null '\;ファイルのタイプを調べ、記述内のテキストを探します。 trueが返された場合(つまり、テキストが行内にある場合)、ファイル名が出力されます。

注:ファイルに-bフラグを使用すると、ファイル名が出力されないため、grepで問題を作成することはできません。たとえば、-bフラグを指定しないと、バイナリファイルのgettextは誤ってテキストファイルとして検出されます。

例えば

[email protected]# find /bin -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print 
/bin/gunzip 
/bin/svnshell.sh 
/bin/unicode_stop 
/bin/unicode_start 
/bin/zcat 
/bin/redhat_lsb_init 
[email protected]# find /bin -type f -name *text* 
/bin/gettext 

EDIT:

圧縮ファイルで見たい場合は、ファイルに--uncompressフラグを使用します。詳細情報とフラグをファイルにするためには、man file

+0

私はUNIXのような生態系には新しいです。なぜあなたの '' grep'の最後に "&"を使用していますか?私の理解は、これはgrepを非同期で実行させることです。これは依然として 'find'に終了ステータスを与えますか?それはなぜでしょうか?答える時間をとっていただきありがとうございます。 –

10

を参照してください方法について

find /dir/to/search -type f | xargs file | grep text

findはあなたのファイルのリストを提供します。

xargs fileは、パイプ入力から各行でfileコマンドを実行します。

私は家庭での使用と呼ばれるディレクトリ内の唯一の人間読み込み可能なファイルを見つけるために例えば

file directory/to/search/* 

を使用

+0

完璧に動作します!ニースの解決策。 – fuuman

-1

file home/* 

を、読み取り可能ファイルは、ASCIIテキスト

+0

これは、ファイルタイプを手動でスキャンすることを除いて、ファイルをフィルタリングする方法を提供しません。 – blissfool

関連する問題