所以我有一个目录,我希望在其中打开该目录中唯一人类可读的文件。我用来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
}