「file」コマンドの出力に基づいてファイルを開く方法

「file」コマンドの出力に基づいてファイルを開く方法

そのため、そのディレクトリから人が読める唯一のファイルを開きたいディレクトリがあります。file *各ファイルの種類を印刷するために使用していますが、ファイルはASCIIテキストとして表示されます。その特定のファイルをcat以下にリダイレクトしてコンテンツを表示するにはどうすればよいですか?

編集する:

あなたは皆素晴らしいです。みんな頑張っています。

答え1

awk以下を使用して、ASCIIテキストを含むファイルを検索できます。

less $(file * | awk -F: '$2 ~ "ASCII text" {print $1}')

これは実際には複数のテキストファイルを含むディレクトリでも機能します。

答え2

次のbash関数は、現在のディレクトリ内のファイルを探します。そのうちの1つが「ASCIIテキスト」を報告すると、そのファイルになりますcat

filecat() {
  local files=(./*)
  local count=0
  local filename=
  local f=
  for f in "${files[@]}"
  do
    if file "$f" 2>/dev/null | grep -q ": ASCII text$"
    then
      count=$((count + 1))
      filename="$f"
    fi
  done
  if [ "$count" -eq 1 ]
  then
    cat "$filename"
  fi
}

答え3

を使用すると、zsh次の関数を定義できます。

 istext() [[ $(file -b --mime-type -- "${1-$REPLY}") = text/* ]]

その後、次のグローバル修飾子で使用できます。

 less -- *(.L+0+istext)

現在のディレクトリで、テキスト形式が空でない(L+0長さが0より大きい)一般ファイル()を表示します。.file

答え4

lessASCIIテキストファイルのみ:

less_if_text() {
   # $1 is the file name
   if file $1 | grep -q 'ASCII .* text' ; then
     less $1
   else
     echo "Not a text file: $1"
   fi
}

シンプルだがわかりやすい方法でテキストファイルを一覧表示します。

ls_texts() {
  ls -a | while read filename; do 
    (file $filename | grep -q 'ASCII .* text') && echo $filename
  done
}

しかし、上記の速度はそれほど高速ではありません。file -f複数のfile通貨を避けるためのより速い方法grep

ls_texts() {
  ls | file -f - | egrep ':\s+ASCII .* text' | while read fname
    do cut -d ':' -f 1 
  done
}

関連情報