firedrillsergeant Asked: 2018-03-23 09:07:44 +0800 CST2018-03-23 09:07:44 +0800 CST 2018-03-23 09:07:44 +0800 CST 如何根据 `file` 命令的输出打开文件 772 所以我有一个目录,我希望在该目录中打开该目录中唯一可读的文件。我file *用来打印每个文件的类型,一个文件显示为 ASCII 文本。如何将该特定文件重定向到 cat 或更少以显示其内容? 编辑: 你们都很棒。我每一个都在尝试。 shell files 5 个回答 Voted Best Answer nohillside 2018-03-23T09:23:07+08:002018-03-23T09:23:07+08:00 您可以使用awk搜索包含 ASCII 文本的文件: less $(file * | awk -F: '$2 ~ "ASCII text" {print $1}') 这实际上也适用于包含多个文本文件的目录。 Jeff Schaller 2018-03-23T10:05:16+08:002018-03-23T10:05:16+08:00 以下 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 } m0dular 2018-03-23T10:07:53+08:002018-03-23T10:07:53+08:00 file这是打开当前目录中的文本文件的安全方法vim。当然,您可以更改vim为echo仅打印名称。 #!/bin/bash for f in *; do out=$(file "$f") [[ "${out##*: }" =~ ASCII ]] && text_files+=("$f") done vim "${text_files[@]}" exit 编辑:#在参数扩展中使用两个符号来处理其中带有 a:的文件名。 Stéphane Chazelas 2018-03-23T10:23:44+08:002018-03-23T10:23:44+08:00 使用zsh,您可以定义如下函数: istext() [[ $(file -b --mime-type -- "${1-$REPLY}") = text/* ]] 然后您可以在 glob 限定符中使用它,例如: less -- *(.L+0+istext) 查看当前目录中的非空(L+0长度大于0)常规文件(.file 9000 2018-03-23T09:28:33+08:002018-03-23T09:28:33+08:00 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 }
您可以使用
awk
搜索包含 ASCII 文本的文件:这实际上也适用于包含多个文本文件的目录。
以下 bash 函数将查看当前目录中的文件;如果其中一个确切地报告为“ASCII 文本”,那么它将
cat
是该文件。file
这是打开当前目录中的文本文件的安全方法vim
。当然,您可以更改vim
为echo
仅打印名称。编辑:
#
在参数扩展中使用两个符号来处理其中带有 a:
的文件名。使用
zsh
,您可以定义如下函数:然后您可以在 glob 限定符中使用它,例如:
查看当前目录中的非空(
L+0
长度大于0)常规文件(.
file
less
如果文件是 ASCII 文本,则仅对文件:以一种简单但易于理解的方式列出文本文件:
不过,上面的速度不是很快。一种更快的方法可以
file -f
用来避免多次file
和grep
调用: