shell one-liner仅在其ASCII格式文件时才捕获文件

时间:2015-08-18 19:06:33

标签: linux bash file shell cat

只有当文件是文本文件时,是否可以将单行写入cat文件,而不是如果它是二进制文件?

类似的东西:

echo "/root/mydir/foo" | <if file is ASCII then cat "/root/mydir/foo"; else echo "file is a binary">

3 个答案:

答案 0 :(得分:2)

filename=$(echo "/root/mydir/foo")
if file "$filename" | grep -q "ASCII text"; then cat "$filename"; else echo "file is a binary"; fi

但为什么它必须在一条线上呢?如果你把它展开,它会更具可读性:

filename=$(echo "/root/mydir/foo")
if file "$filename" | grep -q "ASCII text"
then cat "$filename"
else echo "file is a binary"
fi

答案 1 :(得分:2)

您可以将file命令的输出与--mime-b选项一起使用。

$ file -b --mime filename.bin 
application/octet-stream; charset=binary

-b选项会禁止在输出中打印文件名,因此您不必担心错误匹配文件名,--mime会为您提供字符集。

您可以使用grep来测试charset=binary

的出现次数
$ file -b --mime filename.bin | grep -q "charset=binary"

然后,您可以使用grep&&||运算符的退出状态来cat文件或echo一条消息。

$ echo filename | xargs -I% bash -c 'file -b --mime % | grep -q "charset=binary" || cat % && echo "binary file"'

最后xargs用于插入上一个命令echo filename中的文件名,并在二进制测试命令中替换符号%

答案 2 :(得分:0)

$filename作为您的文件,

grep -P '[\x80-\xFF]' "$filename" && echo "file is a binary" || cat "$filename"
当且仅当cat不包含任何非ASCII字符时,

将等同于$filename

请注意,GNU grep是必需的,因为单行代码需要Perl样式的模式匹配功能(-P)。