shell 仅当文件是 ASCII 格式文件时才用一行来 cat 一个文件
shell one-liner to cat a file only if its ASCII format file
是否可以仅在文件是文本文件而不是二进制文件时将单行写入 cat
文件?
类似于:
echo "/root/mydir/foo" | <if file is ASCII then cat "/root/mydir/foo"; else echo "file is a binary">
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
您可以将 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
的文件名,并替换我们二进制测试命令中的符号%
。
$filename
是你的文件,
grep -P '[\x80-\xFF]' "$filename" && echo "file is a binary" || cat "$filename"
当且仅当 $filename
不包含任何非 ASCII 字符时, 等同于 cat
。
请注意,GNU grep
是必需的,因为单行代码需要 Perl 样式的模式匹配功能 (-P
)。
是否可以仅在文件是文本文件而不是二进制文件时将单行写入 cat
文件?
类似于:
echo "/root/mydir/foo" | <if file is ASCII then cat "/root/mydir/foo"; else echo "file is a binary">
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
您可以将 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
的文件名,并替换我们二进制测试命令中的符号%
。
$filename
是你的文件,
grep -P '[\x80-\xFF]' "$filename" && echo "file is a binary" || cat "$filename"
当且仅当 $filename
不包含任何非 ASCII 字符时, 等同于 cat
。
请注意,GNU grep
是必需的,因为单行代码需要 Perl 样式的模式匹配功能 (-P
)。