【问题标题】:shell one-liner to cat a file only if its ASCII format file仅当文件的 ASCII 格式文件时,shell 单线器才对文件进行分类
【发布时间】:2015-08-18 19:06:33
【问题描述】:

是否可以将单行写入cat 仅当文件是文本文件而不是二进制文件时?

类似:

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

【问题讨论】:

    标签: linux bash file shell cat


    【解决方案1】:

    您可以将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 的退出状态和&amp;&amp;|| 运算符来cat 文件或echo 消息。

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

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 感谢 Barmer,但文件名来自不同的命令,所以我在问题中将其显示为 echo filename
      • 我已将其替换为变量
      • 这也将包含二进制文件,例如“MPEG v4 系统,高级可缩放纹理@L1”和“BLCR 上下文数据(小端序,版本 2)”
      • 我已将其更改为搜索 ASCII text。虽然那样它不会匹配像Bourne-Again shell script text executable 这样的东西。可以改进正则表达式以匹配所需的任何内容,问题的要点似乎是如何将grep 命令合并到脚本中。
      • 如果您对grep 使用-w 选项,它只会列出构成整个单词的匹配项。所以它将匹配script text executable,但不匹配advanced scalable texture
      【解决方案3】:

      $filename 是您的文件,

      grep -P '[\x80-\xFF]' "$filename" && echo "file is a binary" || cat "$filename"
      

      当且仅当$filename 不包含任何非ASCII 字符时,将等同于cat

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 2013-07-18
        • 1970-01-01
        • 2021-02-12
        • 1970-01-01
        • 2016-09-05
        • 2016-01-29
        相关资源
        最近更新 更多