如何根据“file”命令的输出打开文件

如何根据“file”命令的输出打开文件

所以我有一个目录,我希望在其中打开该目录中唯一人类可读的文件。我用来file *打印每个文件的类型,一个文件显示为 ASCII 文本。如何将该特定文件重定向到 cat 或 less 以显示其内容?

编辑:

你们都很棒。我每一个都在尝试。

答案1

您可以使用awk搜索包含 ASCII 文本的文件:

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

这实际上也适用于包含多个文本文件的目录。

答案2

以下 bash 函数将查找当前目录中的文件;如果其中一个报告为“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

仅适用less于 ASCII 文本的文件:

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
}

相关内容