有没有办法在尝试cat
二进制文件时阻止或提示您?
我经常需要处理日志文件或数据文件,其中一些是文本,另一些不是。很容易混淆,而且cat
出于显而易见的原因,意外尝试二进制文件会很烦人。
理想情况下,我想要一个别名cat
,当它检测到文件(很有可能)不是纯文本时会提示您。
答案1
我真的不认为这是值得的,因为你可以在cat
做某事之前进行检查,但你可以在你的函数中设置一个函数~/.bashrc
来执行此操作:
cat(){
for i in "$@"
do
if file --mime "$i" | grep "charset=binary" >/dev/null
then
printf "File %s is binary, skipping\n" "$i" >&2
else
/bin/cat "$i"
fi
done
}
它将运行file
以检查文件的 mime 类型是否为二进制charset=binary
,如果是,它将跳过它。如果该测试失败,则该文件不是二进制文件,并且将/bin/cat
被调用。您可以像使用常规 cat 一样使用它:
$ cat /bin/bash /etc/os-release
File "/bin/bash" is binary, skipping
PRETTY_NAME="Linux Mint LMDE"
NAME="Linux Mint LMDE"
ID=linuxmint
ANSI_COLOR="1;31"
答案2
除了什么说这里你可以只需使用less
代替cat
。
如果文件不是常规文件,它会提示,并提供一些附加信息,例如 zip、rar 存档中的文件列表……
顺便说一下,您甚至可以使用它来转换非读取字符,而无需在每行末尾cat -v
添加。$
答案3
如果您调用file
它-i
,它将返回 mime 类型,允许您确定它是否是文本。
file -i file.name | grep text/ && cat file.name
如果file.name
是二进制&&
则不执行cat
,如果是纯文本则执行。
这现在匹配脚本和其他未标记为“纯文本”的“文本”文件
答案4
例如,将其保存为脚本newcat.sh
,并使其可执行:
#!/bin/bash
result=`file $1 | grep -c "binary"`
if [ "$result" -gt 0 ]
then
echo "executable file"
else
cat $1
fi
然后使用它作为./newcat.sh filename