人間が読めるファイル名を除外するために、[:print:]
(印刷可能な)文字クラス名を利用できます。このようなクラスの詳細については、のマニュアルを参照してくださいgrep
。
find . -type f -size 1033c -name "[[:print:]]*" ! -executable
考え直してみると、「人間が読める」要件は、ファイルの名前ではなく、コンテンツを参照している可能性があります。つまり、テキストファイルを検索することになります。それはもう少しトリッキーです。@D_Byeがコメントで示唆したように、file
コマンドを使用してファイルのコンテンツタイプを判別する必要があります。ただしfile
、パイプの後に実行することはお勧めしません。ファイル名を表示するタスクが複雑になるためです。これが私が提案するものです:
find . -type f -size 1033c ! -executable -exec sh -c 'file -b $0 | grep -q text' {} \; -print
これは簡単にfile
-partがどのように機能するかです:
-exec
述語の実行sh -c 'file -b $0 | grep -q text' FILENAME
各々についてFILENAME
満たすすべての以前の条件(種類、サイズ、非実行)。
- これらのファイルごとに、シェル(
sh
)が次の短いスクリプト:を実行し、ファイル名file -b $0 | grep -q text
に置き換え$0
ます。
file
プログラムは、各ファイルのコンテンツタイプを決定し、この情報を出力します。この-b
オプションは、テストされた各ファイルの名前を印刷しません。
grep
file
プログラムからの出力をフィルタリングし、"text"を含む行を検索します。(file
コマンドの典型的な出力がどのように見えるか、実際に見てください。)
- ただし
grep
、-q
(静かな)オプションが指定されているため、フィルタリングされたテキストは出力されません。それが行うことは、単に終了ステータスを0
( "true"を表す-フィルターされたテキストが見つかった)または1( "エラー"を意味する-テキスト"text"がからの出力に表示されなかったfile
)に変更することです。
- から来る真/偽の終了ステータス
grep
はsh
to によってさらに渡さfind
れ、「-exec sh -c 'file $0 | grep -q text' {} \;
」テスト全体の最終結果として機能します。
- 上記のテストがtrueを返した場合、
-print
コマンドが実行されます(つまり、テストされたファイルの名前が出力されます)。