テキストファイルから文字列のみを取得する方法は? (再帰的に)

テキストファイルから文字列のみを取得する方法は? (再帰的に)

フォルダ内のすべてのテキストファイルをmimetypeで一覧表示できます。

find . -type f -print0 | xargs -0 file -i | fgrep -i text | sed 's/:$//g' 2>/dev/null | awk 'BEGIN {FS=": "} {print $1}'

わかりましたが、このファイルから「STRING」を検索するために「fgrep」をどのように追加しますか(正規表現は必要ありません。これがfgrepの理由です)。

これは悪いです:

fgrep -iR "STRING" *

ISOファイル、バイナリファイルの検索を開始するため...

Fedora14/bash。

答え1

最初、::マニュアルページに記載されているように、grepスイッチを使用してバイナリを検索しないように指定できます。-I

-I     Process a binary  file  as  if  it  did  not  contain  matching data;
       this  is  equivalent  to  the --binary-files=without-match option.

第二、the find:xargs、および多くのパイプの使用を避けるために、手続き型-execテストを使用してくださいfind。以下を使用して、論理テストシーケンスを簡単に作成できます。-exec各連続テストの連続実行もし前のコマンドはすべて0(成功的に完了)を返します。

答え2

@rozcietrzewiaczの解決策は良い解決策ですが、それでもテキストファイル(から返される)を維持したい場合は、ファイル名のfile配列を慎重に構築してからその配列grepからコマンドを実行できます。

私は次のようなことをしたいと思います。

  • ファイル名がない場合は改行文字があります(ただし空白がある可能性があります)。
  • fileサポートとオプションの-0ためのユーティリティ-i
  • \xGNU sedまたは10進文字コードをサポートするsed。

これは例です

#!/bin/bash

get_file_list() {
  local path="$1"
  find "$path" -type f -exec file -0i {} + |
    sed -n '/\x00  *text\//s/\x00.*//p'
}

list=()
while IFS= read -r line; do
  list+=("$line")
done < <(get_file_list .)

# to choose options and pattern
grep -i pattern "${list[@]}"

このコマンドは、ファイル名、NULバイト、およびMIMEタイプで構成されるsed一連のテキスト行を取得します。file2番目の部分(NULの後)に単語が含まれている場合は、text/その部分を削除してファイル名のみを印刷します。それ以外の場合は何も印刷されません。

関連情報